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

时间:2017-04-10 19:24:41

标签: c gcc annotations

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

int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int syslogd_main(int argc UNUSED_PARAM, char **argv)

具体而言,MAIN_EXTERNALLY_VISIBLEUNUSED_PARAM

  1. 这些注释到底在做什么?我在哪里可以阅读更多有关它们和其他注释的内容?
  2. 这些是C标准的一部分,还是编译器扩展?如果它们是编译器扩展,它们的支持程度如何?
  3. 我假设第一个是为什么这个文件没有main()函数。如果这些是编译器扩展而不是标准的一部分,这是否意味着这个文件不能通过仅遵循C标准的编译器按原样编译?
  4. 为什么他们在完全定义之前立即声明了syslogd_main函数的原型? MAIN_EXTERNALLY_VISIBLE注释只能应用于函数原型吗?

1 个答案:

答案 0 :(得分:3)

  

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
  

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

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

  

3。我假设第一个是为什么这个文件没有main()函数。 ...

没有。 BusyBox将许多实用程序组合到一个可执行文件中。这解释了main()中“缺少syslogd.c函数”。

  

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

从GCC手册[声明功能属性]:

  

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