在標頭檔案中定義了很多posix.1和xsi的符號。但是除了posix.1和xsi的定義之外,大多數實現在這些標頭檔案中也加上了它們自己的定義。如果在編譯乙個程式時,希望它只使用posix定義而不使用任何實現自己定義的限制,那麼就需要定義常量_posix_c_source。所有posix.1標頭檔案中都使用此常量。當定義該常量時,就能排除任何實現專有的定義。
注:posix.1標準的以前版本都定義了_posix_source常量。在posix.1的2001版中,它被替換為_posix_c_source。
常量_posix_c_source及_xopen_source被稱為功能測試巨集(feature test macro)。所有功能測試巨集都以下劃線開始。當要使用它們時,通常在cc命令列中以下列方式定義:
cc -d_posix_c_source=200112 file.c
這使得c程式包括任何標頭檔案之前,定義了功能測試巨集。如果我們僅想使用posix.1定義,那麼也可將原始檔的第一行設定為:
#define _posix_c_source 200112
為使single unix specification v3的功能可由應用程式使用,需將常量_xopen_source定義為600。
single unix specification將c99實用程式定義為c編譯環境的介面。隨之,就可以用如下方式編譯檔案:
c99 -d_xopen_source=600 file.c -o file
為了在gcc c編譯器中啟用1999 iso c擴充套件,可以使用-std = c99選項,如下所示:
gcc -d_xopen_source=600 -std=c99 file.c -o file
另乙個功能測試巨集是:__stdc__,它由符合iso c標準的c編譯器自動定義。這樣就允許我們編寫iso c編譯器和非iso c編譯器都能編譯的程式。例如,為了利用iso c原型功能(如果支援),乙個標頭檔案可能包含:
#ifdef __stdc__void *myfunc( const
char *, int
);#else
void *myfunc();
#endif
雖然,當今的大多數c編譯器都支援iso c標準,但在很多標頭檔案中仍舊使用__stdc__功能測試巨集。
本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:。
UNIX標準化及實現之功能測試巨集
在標頭檔案中定義了很多posix.1和xsi的符號。但是除了posix.1和xsi的定義之外,大多數實現在這些標頭檔案中也加上了它們自己的定義。如果在編譯乙個程式時,希望它只使用posix定義而不使用任何實現自己定義的限制,那麼就需要定義常量 posix c source。所有posix.1標頭檔案...
Unix 標準化以及實現
一 unix標準化 1 ansi c ansi c標準的意圖是提供c程式的可移植性,使其能適合於大量不同的作業系統,而不只是unix。此標準不僅定義了c程式設計 語言的語法和語義,也定義了其標準庫。按照該標準定義的各個標頭檔案,可將該庫分成15區。2 ieee posix posix是乙個由ieee...
Unix 標準及實現
人們在 unix 程式設計環境和 c 程式語言的標準化方面已經做了很多努力工作。在20世紀80年代 unix 版本種類快速增加,隨之而來的是它們之間的差別擴大,為了使不同種類的 unix 系統之間應有程式可以順利移植,人們開始呼籲進行unix標準化。自從 1989年 美國國家標準化 ansi 提供c...