我正在查看sigaction的手册页,最后我看到了以下一行。
sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
_POSIX_X_SOURCE,_X_OPEN_SOURCE,_POSIX_SOURCE是什么意思?该怎么办?
答案 0 :(得分:3)
这些是功能测试宏。它们的目的是允许程序通知系统头文件您希望它符合哪些标准,以及您希望使用哪些扩展。
如果没有定义任何功能测试宏,那么它们在标题中可见的宏,函数和类型定义的实现会有很大差异。通常的做法是默认情况下使所有可见,这是一个问题,因为"所有"并不是非常具体,而且程序中使用的符号名称可能会与某些扩展名冲突。即使他们现在不发生冲突,也无法知道他们将来会不会发生冲突。因此,标准(如ISO C和POSIX)对实现提出了严格的要求,即它不会污染应用程序命名空间,并且标准中未明确定义或保留名称。当您使用功能测试宏来请求特定标准时,您要求实施以确保(1)它提供了本标准中定义的所有内容,(2)它不会污染您的应用程序'通过提供该标准中未定义的任何内容来命名空间。
正确的程序应该始终明确地使用正确的功能测试宏来写入它所写的标准。最简单的方法是在编译器命令行(-D
)上放置正确的CFLAGS
参数。在每个源文件中添加#define
作为第一行也可以。请注意,如果您在源文件中执行此操作:
顺便说一句,它与其他功能测试宏不完全相同,但是当在Linux / glibc上构建时,所有现代程序都应定义_FILE_OFFSET_BITS=64
以请求off_t
为64 -bit用于大文件支持。
答案 1 :(得分:1)
以下是功能宏的人:http://www.kernel.org/doc/man-pages/online/pages/man7/feature_test_macros.7.html
他们将在标题中打开或关闭某种程度的标准支持。
E.g。 _POSIX_C_SOURCE> = 1表示应支持POSIX.2-1992或更高版本; _X_OPEN_SOURCE表示已启用POSIX.1,POSIX.2和XPG4;并且对于更大的宏值(> = 500;> = 600;> = 700),它还将打开SUSv2 v3或v4的某些变体(UNIX 98; 03或POSIX.1-2008 + XSI)。 _POSIX_SOURCE是定义_POSIX_C_SOURCE = 1的过时方法
答案 2 :(得分:1)
他们需要#define
来获取原型,并称为feature test macros。
例如,以下代码将成功定义sigaction
的原型:
#define _XOPEN_SOURCE
#include <signal.h>
包含signal.h
而 #define
(或其他人)不会定义原型。
答案 3 :(得分:1)
称为“功能测试宏”的符号用于控制可能包含在标头中的符号的可见性。实现,IEEE Std 1003.1-2001的未来版本以及其他标准可以定义其他功能测试宏。