【发布时间】:2012-05-01 04:37:01
【问题描述】:
我正在做一个项目,代码中包含一个宏定义:
#define __USE_MISC
代码没有使用它,所以我认为它有其他用途。
【问题讨论】:
-
我在
<features.h>__USE_MISC 中找到了这个定义 BSD 和 System V Unix 通用的东西。但我仍然不知道它到底是做什么的。
我正在做一个项目,代码中包含一个宏定义:
#define __USE_MISC
代码没有使用它,所以我认为它有其他用途。
【问题讨论】:
<features.h> __USE_MISC 中找到了这个定义 BSD 和 System V Unix 通用的东西。但我仍然不知道它到底是做什么的。
__USE_MISC 在/usr/include/features.h 中定义的条件:
#if defined _BSD_SOURCE || defined _SVID_SOURCE
# define __USE_MISC 1
#endif
__USE_MISC --> 定义 BSD 和 System V Unix 共有的东西。
因此,即使_BSD_SOURCE 和_SVID_SOURCE 都未定义(自glibc 2.20 起,定义_DEFAULT_SOURCE 启用__USE_MISC),您的代码似乎也希望确保在任何情况下都已定义它。
更多信息请参见feature test macros。
【讨论】:
_BSD_SOURCE 和 _SVID_SOURCE 已被弃用,并被 glibc 2.20 中的 _DEFAULT_SOURCE 取代(_DEFAULT_SOURCE 已添加到 glibc 2.19 中)。
__USE_MISC 是实现的头文件如何处理“功能测试宏”的内部细节,这些宏指示编译器应该为构建提供哪些标准函数集。正如Thiruvalluvar's answer 所示,如果您的构建需要_BSD_SOURCE 或_SVID_SOURCE 配置,它由库头文件设置(供内部使用)。
您的代码/构建不应直接处理该宏;相反,它应该使用记录在案的功能测试宏。 glibc 的文档可以在这里找到:http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html
【讨论】:
-ansi -D_DEFAULT_SOURCE=__STRICT_ANSI__ 的情况,因为仅-ansi 就让struct in6_addr 的成员未定义。 -D_DEFAULT_SOURCE=__STRICT_ANSI__ 确保 __USE_MISC 得到定义。另见‘struct in6_addr’ has no member named ‘s6_addr32’ with -ansi。感觉不舒服,因为我从来没有这样做过。