类似_GNU_SOURCE的宏定义,它们的含义是什么?

3

在引用Linux头文件或man文件时,经常会看到以下宏的使用:

例如:man mkstemp

在该man页面中,我们可以看到以下宏的特点。

_GNU_SOURCE
_BSD_SOURCE
_SVID_SOURCE
_XOPEN_SOURCE
_XOPEN_SOURCE_EXTENDED

如果我使用这些API/Headers,我应该了解什么才能编写正确的程序?


你应该更精确地定义“正确程序”的含义。相对于哪些标准? - Basile Starynkevitch
1个回答

3

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

您可以使用一些特殊功能符号来编译整个程序。例如,我经常使用-D_GNU_SOURCE编译程序。这意味着我希望我的系统提供由GNU libc等提供的所有额外的GNU专有功能。如果您想要严格的POSIX2001合规性(仅此而已),则可以改为使用-D_POSIX_C_SOURCE=200112L编译。

或者,如果您所有的.c文件只包含自己的头文件,则该头文件可以以#define _GNU_SOURCE 1开头,后面跟随几个系统#include....

关键在于,GNU/Linux系统遵守多个标准(GNU提供其自己的标准),您可以选择其中之一。

GNU libc(这是Linux上最常见的libc,但您也可以使用其他libc,例如musl-libc....)提供了许多在其他系统上不可用的函数、特性和头文件,例如<argp.h>(头文件)、fopencookie(函数)、printf中的%m格式控制指令。

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


谢谢。那bionic libc怎么样?目前在安卓中使用这些API(mkstemps)时,尽管包含头文件(stdlib.h),仍会收到隐式声明警告。 - Sandeep
我不知道。请阅读Bionic libc文档。我听说它不完全符合Posix标准(边缘情况,通常是这样的)。 - Basile Starynkevitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接