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 int
或 unsigned long
作为类型,而不是这些宏。
我正在尝试使 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 int
或 unsigned long
作为类型,而不是这些宏。