地塊多次參照linux的頭文件或文件的人,我看到以下宏..像_GNU_SOURCE這樣的宏,它們是什麼意思?
例:man mkstemp
在此手冊頁,我們可以看到下面的宏功能。
_GNU_SOURCE
_BSD_SOURCE
_SVID_SOURCE
_XOPEN_SOURCE
_XOPEN_SOURCE_EXTENDED
如果我正在使用這些API /頭文件,我應該瞭解如何編寫正確的程序?
地塊多次參照linux的頭文件或文件的人,我看到以下宏..像_GNU_SOURCE這樣的宏,它們是什麼意思?
例:man mkstemp
在此手冊頁,我們可以看到下面的宏功能。
_GNU_SOURCE
_BSD_SOURCE
_SVID_SOURCE
_XOPEN_SOURCE
_XOPEN_SOURCE_EXTENDED
如果我正在使用這些API /頭文件,我應該瞭解如何編寫正確的程序?
閱讀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特定功能。
謝謝。仿生libc怎麼樣?目前,當我在android中使用這些API(mkstemps)時,儘管包含頭文件(stdlib.h),我仍然得到隱式聲明warnig。 – 2014-10-17 05:28:55
我不知道。閱讀仿生libc文檔。我聽說它不完全符合Posix(邊界線,即它通常是) – 2014-10-17 05:30:40
您應該更精確地定義「正確程序」的含義。相對於哪個標準? – 2014-10-17 05:16:33