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

时间:2015-06-23 21:48:56

标签: c++ type-conversion c-preprocessor

我正在尝试使特定于板的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) {...}

或者我必须做些其他事情来使这项工作?

此外,任何有关更好/更准确的问题标题的建议都会受到赞赏 - 我甚至不知道该怎么说。

3 个答案:

答案 0 :(得分:2)

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

与微软的类似宏STDMETHOD比较:

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

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

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

答案 1 :(得分:1)

如果先前未定义名称,则条件定义用于防止编译错误。潜在地,这种结构可以用于在变量类型上有一些修饰符。

如果预定义UNIQUEDLLAPI(从较早的标题或使用命令行选项)等于' const',请考虑会发生什么。 该流程将跳过第一个#ifndef并保持原样UNIQUEDLLAPI,之后类型定义将是const类型。

关于铸造的有效性,这取决于2"装饰的实际用途。定义

答案 2 :(得分:0)

如果UNIQUEAPI被定义为mabe是无符号长long而不是unsigned long,则他们可能想要另一种数据类型。

Bool在ANSI C中不可用,因此这里不可能进行简单的转换。