这里有什么类型的typedef?

时间:2016-02-23 08:10:41

标签: c++ c char function-pointers typedef

我很难弄清楚这里有什么用途typedef -

typedef char TYPE_SSOSettingError;
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);

从第一行开始,我了解TYPE_SSOSettingError定义为char

从下一行我可以看出ans_executeDomainRegistration是一个指向函数的指针,该函数的返回类型为void,并且接受char类型的参数,在这种情况下{ {1}}

那么最后一行中TYPE_SSOSettingError的用途是什么?

8 个答案:

答案 0 :(得分:6)

正如您所指出的,typedef是指向函数的指针。因此,它可用于声明指向所述函数的指针,然后将其绑定到具有所述签名的函数的实际指针,然后根据需要调用。

typedef char TYPE_SSOSettingError;
typedef void (*ans_executeDomainRegistration) (TYPE_SSOSettingError);
// ...
void somefunc(TYPE_SSOSettingError);
// ...
ans_executeDomainRegistration ptr = &somefunc;

典型的用例是使用某种回调函数。它在标准库中用于设置终止函数等std::set_terminateterminate 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_ptr1fct_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_executeDomainRegistrationvoid ( * )( 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;