我很难弄清楚这里有什么用途typedef
-
typedef char TYPE_SSOSettingError;
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
从第一行开始,我了解TYPE_SSOSettingError
定义为char
。
从下一行我可以看出ans_executeDomainRegistration
是一个指向函数的指针,该函数的返回类型为void
,并且接受char
类型的参数,在这种情况下{ {1}}
那么最后一行中TYPE_SSOSettingError
的用途是什么?
答案 0 :(得分:6)
正如您所指出的,typedef
是指向函数的指针。因此,它可用于声明指向所述函数的指针,然后将其绑定到具有所述签名的函数的实际指针,然后根据需要调用。
typedef char TYPE_SSOSettingError;
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
// ...
void somefunc(TYPE_SSOSettingError);
// ...
ans_executeDomainRegistration ptr = &somefunc;
典型的用例是使用某种回调函数。它在标准库中用于设置终止函数等std::set_terminate
和terminate handler typedef
。
typedef void (*terminate_handler)();
std::terminate_handler set_terminate( std::terminate_handler f );
更一般地说,使用typedef
(和类型别名using
)提供了一种提供更好抽象的技术。
void (*ptr) (char) = &somefunc; // 1
ans_executeDomainRegistration ptr = &somefunc; // 2
你的例子,第1行不清楚ptr
将用于什么,第2行提供更清晰的意图,ptr
将用作执行域的函数调用注册和该功能接受SSO设置错误。
这是一种使代码更易于阅读,更好,更简洁或更简洁的技术,以便在代码中表达概念(对于更容易,更好等的一些定义)。好好利用它们;如果使用不当,它们也会使代码更加模糊,更难以阅读和理解。
答案 1 :(得分:4)
要做出更明确的声明:
int register_callback(void (*execute) (TYPE_SSOSettingError));
VS
int register_callback(ans_executeDomainRegistration* execute));
另外,要明确函数指针应该是什么。
答案 2 :(得分:3)
你是对的,这是一个带有返回值void
和参数TYPE_SSOSettingError
的函数指针的typedef。
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
后,您会发现它更为熟悉
如果已为函数指针声明了类型,则声明指针或函数。
答案 3 :(得分:2)
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
typedef指向类型为void(char)
的函数的函数指针。
示例:
void foo(char) {
...
}
int main() {
ans_executeDomainRegistration f = &foo;
f('a');
}
答案 4 :(得分:2)
我想您已经了解typedef
,而且您在第二typedef
询问为何使用定义的typedef
。
那么最后一行中typedef的用途是什么。
保证如果TYPE_SSOSettingError
发生变化,参数的ans_executeDomainRegistration
类型也会发生变化。
答案 5 :(得分:2)
第二个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');
}
答案 6 :(得分:1)
考虑一个返回类型为ans_executeDomainRegistration
的函数指针的函数。
想象一下:
ans_executeDomainRegistration getDomainRegistrationFunction(enum DomainType d)
{
return global_ans_executeDomainRegistration[getDomainindex(d)];
}
被称为:
(*getDomain(MY_DOMAIN))(varSSOSettingError);
答案 7 :(得分:1)
在C ++ 11中,您可以使用别名声明,而不是看起来更清晰的typedef。
例如
using ans_executeDomainRegistration = void ( * )( TYPE_SSOSettingError );
从此声明可以看出ans_executeDomainRegistration
是void ( * )( TYPE_SSOSettingError )
类型的名称。也就是说,这个名称表示一个参数的函数指针类型,返回类型为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;