C++中复杂的Typedef
complicated Typedef in C++
我知道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
预处理代码可能会有所帮助。
这是#define
和typedef
用法差异的一个有趣的例子。
#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
只是增加了混乱。
- C++:TypeDef使用元组
- 函数复杂度分析
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 为什么在使用typedef时类推导指南会失败
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- 使用 Python Extension API 包装复杂C++类
- typedef 枚举和枚举类有什么区别?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- 将平面阵列重塑为复杂的特征类型
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 了解复杂的Typedef表达式
- C++中复杂的Typedef