C++中复杂的Typedef

complicated Typedef in C++

本文关键字:Typedef 复杂 C++      更新时间:2023-10-16

我知道typedef可以用来定义一个新的自定义类型,例如:

// simple typedef
typedef unsigned long ulong;
// the following two objects have the same type 
unsigned long l1;
ulong l2;

我最近遇到了这个typedef,在破译声明中发生的事情时迷失了方向:

typedef int16_t CALL_CONVENTION(* product_init_t)(product_descript_t *const description)

有人能指导我解释一下这是怎么回事吗?

编辑:将NEW_TYPE更改为CALL_CONVENTION。这是一个定义。谢谢你发现了这一点。

它将类型product_init_t声明为指向

  • 取参数product_descript_t *const description
  • 返回CCD_ 3
  • 使用调用约定CALL_CONVENTION(正如@M.M所建议的那样,即使命名错误)

p.S.由于">2016年的完整答案应该显示出写这个type-alias的现代方式"(@Howard Hinnant),这里是:

using product_init_t = int16_t (CALL_CONVENTION *)(product_descript_t *const description);

以下是如何理解复杂的typedefs:首先看去掉typedef的行:

int16_t NEW_TYPE (* product_init_t)(product_descript_t *const description);

然后计算出这行将声明什么:它是一个名为product_init_t的变量,具有特定类型。

最后,添加typedef意味着它声明product_init_t是该特定类型的别名,而不是该类型的变量。


要完成上述声明,可以使用cdecl,也可以使用可能的声明符(指针、数组、函数)的知识从外部攻击它。

在这种情况下,最外层的功能是右侧的参数列表,因此我们怀疑这可能是一个函数声明符。函数声明符(大致)如下:

returntype    function_name   (parameters_opt)

尽管要记住,常见的编译器扩展是通过__declspec或其他方式在与返回类型相同的位置指定函数的附加属性;或者可能存在extern "C"等等

到目前为止,我们所处的阶段是(*product_init_t)是一个以int16_t NEW_TYPE作为返回类型(以及可能的declspec)和参数列表(product_descript_t *const description)的函数。

最后,* product_init_t只是一个指针声明符,因此我们得出结论,product_init_t是指向上述类型函数的指针。

您的评论表示对NEW_TYPE不确定。它将是前面已经定义的东西(或者编译器扩展关键字);如果IDE找不到它的定义,那么用gcc -E预处理代码可能会有所帮助。

这是#definetypedef用法差异的一个有趣的例子。

#define FX_TYPE void (*)(int)
typedef void (*stdfx)(int);
void fx_typ(stdfx fx); /* ok */
void fx_def(FX_TYPE fx); /* error */

请看这里

因此,在以下情况下:

typedef int16_t CALL_CONVENTION(* product_init_t)(product_descript_t *const description)

我们可以使用上面的typedef如下:

void fx_typ(product_init_t fx);

CCD_ 22是指向以CCD_ 23为自变量并返回CCD_ 24的函数的指针。

CALL_CONVENTION的使用令人困惑,但是,它可以被空宏抑制,如下所示:

#define  CALL_CONVENTION

注:上述微型无机身。在我看来,CALL_CONVENTION只是增加了混乱。