我正在查看传递给我的代码以解决问题,但我无法理解函数的定义之一。
void DESC_API ApplDesc(DescMsg* pMsg)
我可以看到函数没有返回任何内容,因此void
保持良好状态。但DESC_API
在这做什么呢?这是在头文件
#if defined(DESC_API)
#else
/* No paging used. */
#define DESC_API
#endif
答案 0 :(得分:3)
看起来DESC_API
a是可见性宏。对于MSVC,可能会定义为__declspec(dllexport)
或__declspec(dllimport)
,对于gcc或clang,可能定义为__attribute__ ((visibility ("default")))
。
当然,它可能被定义为其他东西(如下所述),但最流行的用例只是符号可见性属性。
由于gcc和clang默认导出所有符号,因此不需要任何属性,DESC_API
为空。至于MSVC,您的构建系统可能会通过外部/DDESC_API=__declspec(dllimport)
设置它。
答案 1 :(得分:1)
看起来DESC_API
可用于在返回任何内容的函数和返回void*
的函数之间切换。
如果你定义
#define DESC_API *
该函数将返回一个void指针;否则,该函数将不返回任何内容。
当然,函数的其余部分必须根据DESC_API
的值进行条件返回。
答案 2 :(得分:1)
宏似乎是一个钩子,通过该钩子可以将额外的限定符注入到函数签名中。我倾向于认为它的用途是在某些情况下利用特定于编译器的扩展,例如将函数标记为使用某些特定的调用约定。
请注意,您提供的宏定义是有条件的。它提供了在未定义宏的情况下定义宏(带有空替换文本),其中先前的定义可能来自另一个头或命令行选项。
答案 3 :(得分:0)
好吧,可能什么也没做,因为你可以通过宏看到DESC_API被空格替换,因此这可能是一个用于方便阅读的宏,但它是