2014-10-17 47 views
3

地塊多次參照linux的頭文件或文件的人,我看到以下宏..像_GNU_SOURCE這樣的宏,它們是什麼意思?

例:man mkstemp

在此手冊頁,我們可以看到下面的宏功能。

_GNU_SOURCE 
_BSD_SOURCE 
_SVID_SOURCE 
_XOPEN_SOURCE 
_XOPEN_SOURCE_EXTENDED 

如果我正在使用這些API /頭文件,我應該瞭解如何編寫正確的程序?

+0

您應該更精確地定義「正確程序」的含義。相對於哪個標準? – 2014-10-17 05:16:33

回答

3

閱讀feature_test_macros(7)手冊頁(和GNU libc文檔的§1.3.4 Feature Test Macros章節)。

您可能會用一些特殊功能符號編譯您的整個程序。例如,我經常編寫一個帶有-D_GNU_SOURCE的程序。這意味着我需要GNU libc等在我的系統上提供的所有額外的GNU特定功能。如果您想嚴格遵守(僅此而已),則可以使用-D_POSIX_C_SOURCE=200112L編譯。

另外,如果您的所有.c文件只是#include -ing只有你自己的頭,這個頭可以用#define _GNU_SOURCE 1由幾個系統#include啓動....

的一點是,GNU/Linux系統服從到幾個標準(GNU提供自己的標準),你可以選擇哪些標準。

GNU libc(這是Linux上最常用的libc,但您可以使用其他libc,如musl-libc ....)提供了許多其他系統上不可用的功能,功能和標頭,例如, <argp.h>(標題),fopencookie(功能),%m格式控制指令printf功能。

如果您打算將程序移植到其他POSIX系統(例如MacOSX),這也是相關的。在MacOSX或AIX系統上,您沒有getopt_long,因爲它是GNU特定功能。

+0

謝謝。仿生libc怎麼樣?目前,當我在android中使用這些API(mkstemps)時,儘管包含頭文件(stdlib.h),我仍然得到隱式聲明warnig。 – 2014-10-17 05:28:55

+0

我不知道。閱讀仿生libc文檔。我聽說它不完全符合Posix(邊界線,即它通常是) – 2014-10-17 05:30:40