C 了解函数的返回类型
我正在查看传递给我的代码,以解决一个问题,但我很难理解函数的一个定义C 了解函数的返回类型,c,return-type,C,Return Type,我正在查看传递给我的代码,以解决一个问题,但我很难理解函数的一个定义 void DESC\u API ApplDesc(DescMsg*pMsg) 我可以看到函数没有返回任何内容,因此void保持良好。但是DESC_API在这里做什么?这是如何在头文件中定义的 #if defined(DESC_API) #else /* No paging used. */ #define DESC_API #endif 嗯,可能什么都不做,正如你从宏中看到的,描述API被blank替换了,因此这可能是一个
void DESC\u API ApplDesc(DescMsg*pMsg)
我可以看到函数没有返回任何内容,因此void
保持良好。但是DESC_API
在这里做什么?这是如何在头文件中定义的
#if defined(DESC_API)
#else
/* No paging used. */
#define DESC_API
#endif
嗯,可能什么都不做,正如你从宏中看到的,描述API被blank替换了,因此这可能是一个用于可读性方便的宏,虽然它是这样的,但可能什么都不做,正如你从宏中看到的,描述API被blank替换了,因此,这可能是一个用于可读性方便的宏,尽管它看起来像
DESC_API
可以用于在不返回任何内容的函数和返回void*
的函数之间切换
如果你定义
#define DESC_API *
函数将返回一个空指针;否则,函数将不返回任何内容
当然,函数的其余部分必须根据
DESC_API
的值进行条件返回。看起来DESC_API
可以用于在不返回任何内容的函数和返回void*
的函数之间切换
如果你定义
#define DESC_API *
函数将返回一个空指针;否则,函数将不返回任何内容
当然,函数的其余部分必须根据
DESC_API
的值进行有条件的返回。宏似乎是一个钩子,通过它可以向函数签名中注入额外的限定符。我倾向于认为它的预期用途是在某些情况下利用编译器特定的扩展,例如将函数标记为使用某些特定的调用约定
请注意,您提供的宏定义是有条件的。它提供了在尚未定义宏的情况下定义宏(使用空替换文本),其中先前的定义可能来自另一个标题或命令行选项。宏似乎是一个钩子,通过它可以将其他限定符插入函数签名中。我倾向于认为它的预期用途是在某些情况下利用编译器特定的扩展,例如将函数标记为使用某些特定的调用约定
请注意,您提供的宏定义是有条件的。它提供了在尚未定义宏的情况下定义宏(使用空替换文本),以前的定义可能来自另一个标题或命令行选项。看起来像
DESC\u API
是可见性宏。对于MSVC,可以将其定义为\uuuuuu declspec(dllexport)
或\uuuu declspec(dllimport)
,对于gcc或clang,可以将其定义为\uuuu属性((可见性(“默认”))
当然,它可能被定义为其他东西(如下面所说),但最流行的用例只是符号可见性属性
由于默认情况下gcc和clang导出所有符号,因此不需要任何属性,
DESC_API
为空。至于MSVC,您的生成系统可能会通过外部的/DDESC\u API=\uu declspec(dllimport)
设置它。看起来像DESC\u API
是一个可见性宏。对于MSVC,可以将其定义为\uuuuuu declspec(dllexport)
或\uuuu declspec(dllimport)
,对于gcc或clang,可以将其定义为\uuuu属性((可见性(“默认”))
当然,它可能被定义为其他东西(如下面所说),但最流行的用例只是符号可见性属性
由于默认情况下gcc和clang导出所有符号,因此不需要任何属性,
DESC_API
为空。至于MSVC,您的构建系统可能会通过/DDESC\u API=\uu declspec(dllimport)
外部设置它。小心。提供的代码仅在尚未定义时才将DESC_API
定义为“无”。请小心。提供的代码仅在尚未定义时才将DESC_API
定义为nothing。可能,但OP注意到该函数没有返回任何内容。他可能没有提到影响这一点的条件编译指令,但我认为更可能的是宏的预期用途有点不同。也许吧,但OP注意到函数没有返回任何内容。他可能没有提到影响这一点的条件编译指令,但我认为更可能的是,宏的预期用途有点不同。构建中的某些内容可能是在编译器命令行上定义DESC_API。它可能什么都不做。我认为它可能是一个钩子,用于一些从未实现或在编译时注入的东西(如下面的答案所述)。你有没有试过告诉你的编译器只做预处理部分(例如,'gcc-E'),看看它会分解成什么?也许这会给你更多的线索来了解正在发生的事情。构建中的某些东西可能是在编译器命令行上定义DESC_API。它可能什么都不做。我认为它可能是一个钩子,用于一些从未实现或在编译时注入的东西(如下面的答案所述)。你有没有试过告诉你的编译器只做预处理部分(例如,'gcc-E'),看看它会分解成什么?也许这会给你更多关于发生了什么的线索。