C++ 专有定义 'unique_bool' 和 'unique_ulong',类型转换回 'bool' 和 'ulong'

C++ Proprietary Definition 'unique_bool' and 'unique_ulong', type conversion back to 'bool' and 'ulong'

我正在尝试使 board-specific API (C++) 更通用。我可以访问他们的 .h 文件。在 header 文件的顶部,它们 "redfine" 布尔和 ulong 类型('unique' 替换它们的专有名称):

#ifndef UNIQUEDLLAPI
#define UNIQUEDLLAPI
#endif
#ifndef UNIQUEAPI
#define UNIQUEAPI
#endif

#define uniqueret_bool UNIQUEDLLAPI unsigned int UNIQUEAPI
#define uniqueret_ulong UNIQUEDLLAPI unsigned long UNIQUEAPI

谁能给我解释一下语法? 我知道这个指令的 "definition" 是:#define identifier token-string-opt,它似乎做了类似的事情:

#define unsigned long ulong

以便更轻松地打字。但我只是不明白他们写的语法,就像上面的人一样。前面的定义(即 UNIQUEDLLAPI 和 UNIQUEAPI)如何发挥作用?

将这些类型转换回 bool 和 ulong 有什么问题吗? 我可以直接转换吗,例如:

uniqueret_bool a;
if ((bool) a) {...}

或者我是否需要做其他事情才能完成这项工作?

此外,任何关于 better/more 准确问题标题的建议都将不胜感激——我什至不知道如何措辞。

条件定义是为了防止先前未定义名称时出现编译错误。潜在地,这种结构可用于对变量类型进行一些修饰。

考虑一下如果 UNIQUEDLLAPI 预定义(来自较早的 header,或使用命令行选项)等于 'const'.
会发生什么 该流程将跳过第一个 #ifndef 并保持 UNIQUEDLLAPI 不变,稍后类型定义将是 const 类型。

关于转换的有效性,这取决于2 "decorating"定义的实际使用。

如果 UNIQUEAPI 被定义为 unsigned long long 而不是 unsigned long,他们可能需要另一种数据类型。

布尔在 ANSI C 中不可用,因此这里无法进行简单的转换。

这些不是类型,它们是函数声明助手,它们使用平台特定的好东西注释函数类型,例如 __stdcall__declspec(dllimport)(对于 Microsoft 编译器。GCC 有 __attribute__).没有特别的韵律或理由来控制哪些在 return 类型之前,哪些在之后,开发人员显然选择使用宏对其进行编码,而不是记住正确的顺序。

对比微软的类似宏,STDMETHOD:

#define STDMETHODCALLTYPE __stdcall
#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method

请记住,宏是简单(但功能强大)的文本替换,它们不仅仅是 typedef.

的古老形式

为了解决您建议的用法,答案是您不应该将这些宏与变量声明一起使用,而只能使用函数(可能用于函数指针)。要从对此类函数的调用中捕获 return 值,请使用 unsigned intunsigned long 作为类型,而不是这些宏。