2012-01-12 301 views

回答

3

而開發的應用程序符合POSIX.1 - (IEEE 1003.1-2008,ISO/IEC 9945:2009)和/或Single Unix Specification 2008(ISO/IEC 9945:2009年的X/Open詛咒)有助於確保您的應用程序的便攜性。 _GNU_SOURCE很可能會限制GNU/Linux和GNU/Hurd系統的源代碼使用,除非在其他平臺上進行了額外的工作來解決此類功能的不可移植性問題。

有些公司和政府/軍事合同可能需要使用某些平臺標準。

如果您正在開發一個開放源代碼/免費軟件應用程序,您希望在多個Unix和類Unix系統(包括Microsoft Windows NT,2000和更新的POSIX兼容性可用的更新版本)上使用,那麼限制您的開發到POSIX.1庫函數使得這是一項更容易的任務。其他目標包括不包括_GNU_SOURCE功能的免費/開放BSD平臺NetBSD,FreeBSD,OpenBSD,DragonflyBSD以及商業Unix系統(Solaris,AIX,HP/UX等)。

如果您使用可變功能的便攜式功能,我想不出一個例子,但我相信它們確實存在,它可能會在非GNU平臺上創建微妙的錯誤。因此,一般來說,如果你的開發已經被鎖定到GNU/Linux和GNU/Hurd中,那麼可以自由地使用這樣的擴展,但是避免這種用於任何可能部署在其他類Unix操作系統上的應用程序。

我的工作是從另外兩個Unix平臺移植到Linux的大型代碼庫,我們儘量少用_GNU_SOURCE擴展,雖然大部分開發僅限於現代POSIX或IEEE 1003.1/Single Unix Spec和C99(標準C庫)標準,用於未來的兼容性。

+0

感謝您的回覆。之間,我嘗試了以下代碼:#include int main(int argc,char ** argv) { char * p;asprintf(&p,「%s」,「Welcome」); printf(「String is%s」,p); } gcc -o mysample mysample.c:我能夠編譯和執行代碼。我在soure代碼中包含無處_GNU_SOURCE,而不是在編譯時使用宏。但仍然如何編譯? – Whoami 2012-01-21 04:30:23

+1

關於[C語言選項](http://goo.gl/z0Piy)的GCC文檔列出'gnu89'/'gnu90'是默認的(在版本4.6.2以及許多其他版本中)。 'gcc -v'來檢查你的版本,'cpp -dM mctylr 2012-01-25 22:09:28

+0

關於「便攜式功能的改變的功能」:我有興趣在不同的功能測試宏下找到具有不同聲明的函數的示例,並且發現一個:[mmap根據POSIX合規性級別聲明不同,至少在Solaris ](http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html?printOnly=1)。 – hmijail 2017-02-18 00:19:03

5

_GNU_SOURCE支持對GNU C庫支持的C和OS標準的GNU擴展,如asprintf。當你使用這樣的非標準函數和宏時定義它。

+0

使用這種非標準的缺點是什麼?它不能跨平臺移植? – Whoami 2012-01-12 14:36:15

+0

@Whoami:確實是不可移植的。 C庫文檔的標準功能遵守的聯機幫助頁。 – 2012-01-12 14:36:50

+0

感謝您的回覆。之間,我嘗試了以下代碼:#include int main(int argc,char ** argv){char * p; asprintf(&p,「%s」,「歡迎」); printf(「String is%s」,p); } gcc -o mysample mysample.c:我能夠編譯和執行代碼。我在soure代碼中沒有包含_GNU_SOURCE,也沒有在編譯時使用宏。但仍然如何編譯? – Whoami 2012-01-21 04:35:26

1

庫中提供了非標準規定的某些功能,但只有在定義了某些功能測試宏時纔可用。 _GNU_SOURCE是使這些功能可用的宏之一。

相關問題