我正在尝试使特定于板的API(C ++)更通用。我可以访问他们的.h文件。在头文件的顶部,他们" redfine" boolean和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
有人可以向我解释语法吗? 我知道"定义"该指令是:#define identifier token-string-opt ,它似乎做了类似的事情:
#define unsigned long ulong
这样可以更轻松地打字。但我只是不理解他们写的语法,如上所述。先前的定义(即UNIQUEDLLAPI和UNIQUEAPI)如何发挥作用?
将这些类型强制转换回bool和ulong是否存在任何问题?我可以直接投射,例如:
uniqueret_bool a;
if ((bool) a) {...}
或者我必须做些其他事情来使这项工作?
此外,任何有关更好/更准确的问题标题的建议都会受到赞赏 - 我甚至不知道该怎么说。
答案 0 :(得分:2)
这些不是类型,它们是函数声明助手,使用特定于平台的好东西注释函数类型,例如__stdcall
和__declspec(dllimport)
(使用Microsoft编译器.GCC具有__attribute__
) 。在返回类型之前没有特别的押韵或理由控制其中的哪一个以及之后,开发人员显然选择使用宏来编码而不是记住正确的顺序。
与微软的类似宏STDMETHOD
比较:
#define STDMETHODCALLTYPE __stdcall
#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method
请记住,宏是简单(但功能强大)的文本替换,它们不仅仅是typedef
的古老形式。
为了解决您的建议用法,答案是您不应该将这些宏用于变量声明,只能使用函数(可能用于函数指针)。要从对此类函数的调用中捕获返回值,请使用unsigned int
或unsigned long
作为类型,而不是这些宏。
答案 1 :(得分:1)
如果先前未定义名称,则条件定义用于防止编译错误。潜在地,这种结构可以用于在变量类型上有一些修饰符。
如果预定义UNIQUEDLLAPI
(从较早的标题或使用命令行选项)等于' const',请考虑会发生什么。
该流程将跳过第一个#ifndef
并保持原样UNIQUEDLLAPI
,之后类型定义将是const类型。
关于铸造的有效性,这取决于2"装饰的实际用途。定义
答案 2 :(得分:0)
如果UNIQUEAPI被定义为mabe是无符号长long而不是unsigned long,则他们可能想要另一种数据类型。
Bool在ANSI C中不可用,因此这里不可能进行简单的转换。