这些函数和参数注释是什么?

Woo*_*low 1 c gcc annotations

busybox syslogd 实现的源代码包含一些我不熟悉的注释。语言是C,而不是C++。

int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int syslogd_main(int argc UNUSED_PARAM, char **argv)
Run Code Online (Sandbox Code Playgroud)

具体来说,MAIN_EXTERNALLY_VISIBLE并且UNUSED_PARAM

  1. 这些注释到底在做什么?我在哪里可以阅读有关它们和其他注释的更多信息?
  2. 这些是 C 标准的一部分,还是编译器扩展?如果它们是编译器扩展,它们的支持范围有多大?
  3. 我认为第一个原因是这个文件没有功能的原因main()。如果这些是编译器扩展而不是标准的一部分,这是否意味着仅遵循 C 标准的编译器无法按原样有意义地编译该文件?
  4. 为什么他们syslogd_main在完整定义之前声明函数的原型?MAIN_EXTERNALLY_VISIBLE注解只能应用于函数原型吗?

ser*_*gej 7

1. 这些注解到底是做什么的?

请参阅include/platform.hinclude/libbb.h

UNUSED_PARAM扩展到__attribute__ ((__unused__)). 它将变量(argc在您的示例中)指定为“可能未使用”并禁用“未使用变量”警告。

来自 GCC 手册 [指定变量的属性]:

unused 该属性附加到变量上,意味着该变量可能未被使用。GCC 不会对此变量产生警告。

MAIN_EXTERNALLY_VISIBLE扩展到EXTERNALLY_VISIBLE,然后扩展到__attribute__(( visibility("default") ))。它控制函数的可见性。

来自GCC手册[声明函数的属性]:

...在 ELF 上,默认可见性意味着声明对其他模块可见,并且在共享库中意味着声明的实体可以被覆盖。

来自include/libbb.h

/* We need to export XXX_main from libbusybox
 * only if we build "individual" binaries
 */
#if ENABLE_FEATURE_INDIVIDUAL
#define MAIN_EXTERNALLY_VISIBLE EXTERNALLY_VISIBLE
#else
#define MAIN_EXTERNALLY_VISIBLE
#endif
Run Code Online (Sandbox Code Playgroud)

2. 这些是 C 标准的一部分,还是……?

不,这些是 BusyBox 项目中定义的宏。

3. 我认为第一个原因是这个文件没有 main() 函数的原因。...

不会。BusyBox 将许多实用程序合并到一个可执行文件中。这解释main()syslogd.c.

4. 为什么他们在完整定义之前声明 syslogd_main 函数的原型?...

来自GCC手册[声明函数的属性]:

关键字__attribute__允许您在声明时指定特殊属性。