这里的typedef有什么用?
What is the use of typedef here?
我很难弄清楚这里有什么用typedef
-
typedef char TYPE_SSOSettingError;
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
从第一行我了解到 TYPE_SSOSettingError
被定义为 char
。
从下一行我可以看出 ans_executeDomainRegistration
是一个指向具有 return 类型 void
并采用 char
类型参数的函数的指针在这种情况下是 TYPE_SSOSettingError
那最后一行typedef
有什么用呢?
正如您所指出的,typedef
是指向函数的指针。因此它可用于声明指向所述函数的指针,然后将其绑定到指向具有所述签名的函数的实际指针,然后根据需要调用。
typedef char TYPE_SSOSettingError;
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
// ...
void somefunc(TYPE_SSOSettingError);
// ...
ans_executeDomainRegistration ptr = &somefunc;
典型的用例是使用某种回调函数。它在标准库中用于设置终止函数等。std::set_terminate
, with the terminate handler typedef
.
typedef void (*terminate_handler)();
std::terminate_handler set_terminate( std::terminate_handler f );
更一般地说,typedef
(and type aliases using
) 的使用提供了一种提供更好抽象的技术。
void (*ptr) (char) = &somefunc; // 1
ans_executeDomainRegistration ptr = &somefunc; // 2
你的例子,第 1 行不清楚 ptr
的用途,第 2 行提供了更清晰的意图,ptr
将用作函数调用以执行域注册并且该函数接受 SSO 设置错误。
这是一种使代码更易于阅读、更好、简洁或更简洁的技术,以便在代码中表达概念(对于更容易、更好等的某些定义)。好好利用它们;如果使用不当,它们还会使代码更晦涩难懂,更难阅读和理解。
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
typedefs 一个指向void(char)
类型函数的函数指针。
示例:
void foo(char) {
...
}
int main() {
ans_executeDomainRegistration f = &foo;
f('a');
}
要像这样做出更明确的声明:
int register_callback(void (*execute) (TYPE_SSOSettingError));
对
int register_callback(ans_executeDomainRegistration* execute));
此外,为了弄清楚函数指针应该是什么。
我想您已经知道 typedef
,并且您在询问为什么要在第 2 typedef
.
处使用已定义的 typedef
Then what is the use of typedef in the last line.
保证如果TYPE_SSOSettingError
改变,ans_executeDomainRegistration
的参数类型也会改变。
第二个 typedef
使您有一个定义的类型供以后使用。
这里有一个例子来对比使用和不使用 typedef
。
#include <stdio.h>
typedef char TYPE_SSOSettingError;
typedef void(*ans_executeDomainRegistration) (TYPE_SSOSettingError);
void myprint(TYPE_SSOSettingError c)
{
printf("%c\n", c);
}
int main()
{
ans_executeDomainRegistration with_typedef = myprint;
void(*without_typedef) (TYPE_SSOSettingError) = myprint;
with_typedef('w');
without_typedef('o');
}
考虑一个 returns 类型为 ans_executeDomainRegistration
的函数指针的函数。
想象一下:
ans_executeDomainRegistration getDomainRegistrationFunction(enum DomainType d)
{
return global_ans_executeDomainRegistration[getDomainindex(d)];
}
它被称为:
(*getDomain(MY_DOMAIN))(varSSOSettingError);
在C++ 11中你可以使用别名声明来代替看起来更清晰的typedef。
例如
using ans_executeDomainRegistration = void ( * )( TYPE_SSOSettingError );
从这个声明可以看出 ans_executeDomainRegistration
是类型 void ( * )( TYPE_SSOSettingError )
的名称。也就是说,这个名称表示指向具有一个参数的函数的指针类型,并且 return 类型 void
.
所以不要在程序中写例如
typedef char TYPE_SSOSettingError;
void myFunc( TYPE_SSOSettingError );
//...
void (*myFuncPtr1) (TYPE_SSOSettingError) = myFunc;
void (*myFuncPtr2) (TYPE_SSOSettingError) = myFunc;
你可以写
ans_executeDomainRegistration myFuncPtr1 = myFunc;
ans_executeDomainRegistration myFuncPtr2 = myFunc;
你是对的,这是一个具有 return 值 void
和参数 TYPE_SSOSettingError
的函数指针的类型定义。
typedef
可用于增加代码的可读性
使用函数指针。
函数指针声明
例如声明一个函数指针 fct_ptr1
和 fct_ptr2
完全相同:
// Type definition:
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
// Declarations:
ans_executeDomainRegistration fct_ptr1 = foo; // With typedef
void (*fct_ptr2) (TYPE_SSOSettingError) = foo; // Without typedef
函数声明
另外,如果您有任何函数指针作为参数:
// Write:
void SomeFct(ans_executeDomainRegistration param) {...} // With typedef
// Instead of:
void SomeOtherFct(void (*param)(TYPE_SSOSettingError)) {...} // Without typedef
结论
所以作为使用 typedef
的结果,你会发现它更熟悉
如果您已经为函数指针声明了类型,则声明指针或函数。
我很难弄清楚这里有什么用typedef
-
typedef char TYPE_SSOSettingError;
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
从第一行我了解到 TYPE_SSOSettingError
被定义为 char
。
从下一行我可以看出 ans_executeDomainRegistration
是一个指向具有 return 类型 void
并采用 char
类型参数的函数的指针在这种情况下是 TYPE_SSOSettingError
那最后一行typedef
有什么用呢?
正如您所指出的,typedef
是指向函数的指针。因此它可用于声明指向所述函数的指针,然后将其绑定到指向具有所述签名的函数的实际指针,然后根据需要调用。
typedef char TYPE_SSOSettingError;
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
// ...
void somefunc(TYPE_SSOSettingError);
// ...
ans_executeDomainRegistration ptr = &somefunc;
典型的用例是使用某种回调函数。它在标准库中用于设置终止函数等。std::set_terminate
, with the terminate handler typedef
.
typedef void (*terminate_handler)();
std::terminate_handler set_terminate( std::terminate_handler f );
更一般地说,typedef
(and type aliases using
) 的使用提供了一种提供更好抽象的技术。
void (*ptr) (char) = &somefunc; // 1
ans_executeDomainRegistration ptr = &somefunc; // 2
你的例子,第 1 行不清楚 ptr
的用途,第 2 行提供了更清晰的意图,ptr
将用作函数调用以执行域注册并且该函数接受 SSO 设置错误。
这是一种使代码更易于阅读、更好、简洁或更简洁的技术,以便在代码中表达概念(对于更容易、更好等的某些定义)。好好利用它们;如果使用不当,它们还会使代码更晦涩难懂,更难阅读和理解。
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
typedefs 一个指向void(char)
类型函数的函数指针。
示例:
void foo(char) {
...
}
int main() {
ans_executeDomainRegistration f = &foo;
f('a');
}
要像这样做出更明确的声明:
int register_callback(void (*execute) (TYPE_SSOSettingError));
对
int register_callback(ans_executeDomainRegistration* execute));
此外,为了弄清楚函数指针应该是什么。
我想您已经知道 typedef
,并且您在询问为什么要在第 2 typedef
.
typedef
Then what is the use of typedef in the last line.
保证如果TYPE_SSOSettingError
改变,ans_executeDomainRegistration
的参数类型也会改变。
第二个 typedef
使您有一个定义的类型供以后使用。
这里有一个例子来对比使用和不使用 typedef
。
#include <stdio.h>
typedef char TYPE_SSOSettingError;
typedef void(*ans_executeDomainRegistration) (TYPE_SSOSettingError);
void myprint(TYPE_SSOSettingError c)
{
printf("%c\n", c);
}
int main()
{
ans_executeDomainRegistration with_typedef = myprint;
void(*without_typedef) (TYPE_SSOSettingError) = myprint;
with_typedef('w');
without_typedef('o');
}
考虑一个 returns 类型为 ans_executeDomainRegistration
的函数指针的函数。
想象一下:
ans_executeDomainRegistration getDomainRegistrationFunction(enum DomainType d)
{
return global_ans_executeDomainRegistration[getDomainindex(d)];
}
它被称为:
(*getDomain(MY_DOMAIN))(varSSOSettingError);
在C++ 11中你可以使用别名声明来代替看起来更清晰的typedef。
例如
using ans_executeDomainRegistration = void ( * )( TYPE_SSOSettingError );
从这个声明可以看出 ans_executeDomainRegistration
是类型 void ( * )( TYPE_SSOSettingError )
的名称。也就是说,这个名称表示指向具有一个参数的函数的指针类型,并且 return 类型 void
.
所以不要在程序中写例如
typedef char TYPE_SSOSettingError;
void myFunc( TYPE_SSOSettingError );
//...
void (*myFuncPtr1) (TYPE_SSOSettingError) = myFunc;
void (*myFuncPtr2) (TYPE_SSOSettingError) = myFunc;
你可以写
ans_executeDomainRegistration myFuncPtr1 = myFunc;
ans_executeDomainRegistration myFuncPtr2 = myFunc;
你是对的,这是一个具有 return 值 void
和参数 TYPE_SSOSettingError
的函数指针的类型定义。
typedef
可用于增加代码的可读性
使用函数指针。
函数指针声明
例如声明一个函数指针fct_ptr1
和 fct_ptr2
完全相同:
// Type definition:
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
// Declarations:
ans_executeDomainRegistration fct_ptr1 = foo; // With typedef
void (*fct_ptr2) (TYPE_SSOSettingError) = foo; // Without typedef
函数声明
另外,如果您有任何函数指针作为参数:// Write:
void SomeFct(ans_executeDomainRegistration param) {...} // With typedef
// Instead of:
void SomeOtherFct(void (*param)(TYPE_SSOSettingError)) {...} // Without typedef
结论
所以作为使用typedef
的结果,你会发现它更熟悉
如果您已经为函数指针声明了类型,则声明指针或函数。