这里的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_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 的结果,你会发现它更熟悉 如果您已经为函数指针声明了类型,则声明指针或函数。