我看了sigaction的手册页,最后看了下面这一行。
sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE_POSIX_X_SOURCE,_X_OPEN_SOURCE,_POSIX_SOURCE是什么意思?怎么处理它呢?
发布于 2012-01-27 22:05:37
这些是的功能测试宏。它们的目的是允许您的程序通知系统头文件,您希望它尝试符合哪些标准,以及您希望哪些扩展名可用。
在没有定义任何功能测试宏的情况下,实现在其头文件中显示的宏、函数和类型定义有很大的不同。一种常见的做法是在默认情况下使所有内容都可见,这是一个问题,因为“所有内容”并不是非常具体,而且程序中使用的符号名称很可能与某些扩展名冲突。即使他们现在没有冲突,也没有办法知道将来是否会发生冲突。因此,标准(如ISO C和POSIX)对实现提出了严格的要求,即它不能污染未在标准中明确定义或保留的名称的应用程序命名空间。当您使用功能测试宏来请求特定的标准时,您要求实现确保(1)它提供了此标准中定义的所有内容,(2)它不会因为提供该标准中未定义的任何内容而污染您的应用程序的命名空间。
一个正确的程序应该总是显式地使用正确的特性测试宏来满足它所编写的标准。要做到这一点,最简单的方法是在编译器命令行(CFLAGS)上放置正确的-D参数。将#define添加为每个源文件的第一行也是有效的。但是,如果您在源文件中执行此操作,请注意:
在对任何系统头进行included.
顺便说一句,它与其他特性测试宏并不完全相同,但是所有现代程序在构建于Linux/glibc上时都应该定义_FILE_OFFSET_BITS=64,以请求off_t为64位以支持大文件。
发布于 2012-01-27 19:44:27
这里有一个处理功能宏的方法:http://www.kernel.org/doc/man-pages/online/pages/man7/feature_test_macros.7.html
它们将在头文件中打开或关闭某种级别的标准支持。
例如,_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的方法
发布于 2012-01-27 19:44:34
它们是你必须通过#define获得原型的东西,并且被称为feature test macros。
例如,下面的代码将成功定义sigaction的原型
#define _XOPEN_SOURCE
#include <signal.h>包括没有该#define (或其他)的signal.h将不会定义原型。
https://stackoverflow.com/questions/9032782
复制相似问题