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_VISIBLE
和UNUSED_PARAM
。
main()
函数。如果这些是编译器扩展而不是标准的一部分,这是否意味着这个文件不能通过仅遵循C标准的编译器按原样编译?syslogd_main
函数的原型? MAIN_EXTERNALLY_VISIBLE
注释只能应用于函数原型吗?答案 0 :(得分:3)
1。这些注释究竟在做什么?
请参阅include/platform.h和include/libbb.h
UNUSED_PARAM
扩展为__attribute__ ((__unused__))
。它将变量(在您的示例中为argc
)指定为“可能未使用”并禁用“未使用的变量”警告。
从GCC手册[指定变量的属性]:
unused
附加到变量的此属性表示该变量可能未使用。 GCC不会对此变量发出警告。
MAIN_EXTERNALLY_VISIBLE
扩展为EXTERNALLY_VISIBLE
,然后扩展为__attribute__(( visibility("default") ))
。它控制着函数的可见性。
从GCC手册[声明功能属性]:
...在ELF上,默认可见性意味着声明对其他模块可见,并且在共享库中,意味着可以覆盖声明的实体。
/* 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__
允许您在进行声明时指定特殊属性。