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。
main()。如果这些是编译器扩展而不是标准的一部分,这是否意味着仅遵循 C 标准的编译器无法按原样有意义地编译该文件?syslogd_main在完整定义之前声明函数的原型?MAIN_EXTERNALLY_VISIBLE注解只能应用于函数原型吗?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
Run Code Online (Sandbox Code Playgroud)
2. 这些是 C 标准的一部分,还是……?
不,这些是 BusyBox 项目中定义的宏。
3. 我认为第一个原因是这个文件没有 main() 函数的原因。...
不会。BusyBox 将许多实用程序合并到一个可执行文件中。这解释main()了syslogd.c.
4. 为什么他们在完整定义之前声明 syslogd_main 函数的原型?...
来自GCC手册[声明函数的属性]:
关键字
__attribute__允许您在声明时指定特殊属性。