在引用Linux头文件或man文件时,经常会看到以下宏的使用:
例如:man mkstemp
在该man页面中,我们可以看到以下宏的特点。
_GNU_SOURCE
_BSD_SOURCE
_SVID_SOURCE
_XOPEN_SOURCE
_XOPEN_SOURCE_EXTENDED
如果我使用这些API/Headers,我应该了解什么才能编写正确的程序?
阅读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
。