Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 了解函数的返回类型_C_Return Type - Fatal编程技术网

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'),看看它会分解成什么?也许这会给你更多关于发生了什么的线索。