像_GNU_SOURCE这样的宏,它们是什么意思?

时间:2014-10-17 04:38:37

标签: c linux

在引用linux头文件或man文件时多次,我看到使用了以下宏..

例如:man mkstemp

在这个手册页中,我们可以看到下面的宏是特色。

_GNU_SOURCE
_BSD_SOURCE
_SVID_SOURCE
_XOPEN_SOURCE
_XOPEN_SOURCE_EXTENDED

如果我使用这些API&Headers会写出正确的程序,我应该理解什么?

1 个答案:

答案 0 :(得分:3)

阅读feature_test_macros(7)手册页(以及GNU libc文档的§1.3.4 Feature Test Macros章节)。

您可以使用一些特殊功能符号编译整个程序。例如,我经常使用-D_GNU_SOURCE编译程序。这意味着我想要GNU libc等在我的系统上提供的所有额外的GNU特定功能。如果你想要严格的POSIX 2001合规(仅此而已),你可以使用-D_POSIX_C_SOURCE=200112L进行编译。

或者,如果您的.c个文件只是#include - 只有您自己的标头,则该标头可以以#define _GNU_SOURCE 1开头,后跟多个系统#include ...

关键是GNU / Linux系统遵循几个标准(GNU提供自己的标准),你可以选择哪些。

GNU libc(这是Linux上最常用的libc,但你可以使用其他一些libc,比​​如musl-libc ....)提供了许多功能,功能和标题其他系统,例如%m功能中的<argp.h>(标题),fopencookie(功能),printf格式控制指令。

如果您打算编写可移植到其他POSIX系统(例如MacOSX)的程序,这也是相关的。在MacOSX或AIX系统上,由于它是GNU特定功能,因此您没有getopt_long