我知道這是我們傳遞給函數的宏。你如何解釋這個宏的用途,以及在哪種情況下我必須使用它?D_GNU_SOURCE的解釋爲什麼要使用它以及何時使用?
回答
而開發的應用程序符合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庫)標準,用於未來的兼容性。
_GNU_SOURCE
支持對GNU C庫支持的C和OS標準的GNU擴展,如asprintf
。當你使用這樣的非標準函數和宏時定義它。
使用這種非標準的缺點是什麼?它不能跨平臺移植? – Whoami 2012-01-12 14:36:15
@Whoami:確實是不可移植的。 C庫文檔的標準功能遵守的聯機幫助頁。 – 2012-01-12 14:36:50
感謝您的回覆。之間,我嘗試了以下代碼:#include
庫中提供了非標準規定的某些功能,但只有在定義了某些功能測試宏時纔可用。 _GNU_SOURCE
是使這些功能可用的宏之一。
從glibc
手冊:
宏:_GNU_SOURCE
如果你定義了該宏,一切都包含:ISO C89,C99 ISO,POSIX.1,POSIX.2,BSD,SVID ,X/Open,LFS和GNU擴展。在POSIX.1與BSD衝突的情況下,POSIX定義優先。
http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html
- 1. 爲什麼需要「委託」?何時使用它以及如何應用它?
- 2. 什麼是片段URL以及爲什麼要使用它
- 3. 什麼是.inc以及爲什麼要使用它?
- 4. asm(「pause」)做什麼以及爲什麼要使用它
- 5. 爲什麼以及何時使用process.nextTick?
- 6. 爲什麼以及何時使用TreeMap
- 7. 爲什麼以及何時使用__noop?
- 8. 爲什麼以及何時使用LINQ?
- 9. 爲什麼需要一個null shared_ptr以及它如何使用?
- 10. 什麼是OpenEJB中的@Module註釋以及如何使用它?
- 11. 何時以及爲什麼要使用NSUserDefaults的synchronize()方法?
- 12. 何時以及爲什麼要使用@interface ClassName(Private)? - Objective-C的
- 13. 請解釋一下這個結構,以及它爲什麼會這樣使用?
- 14. 什麼是Javascript方法CollectGarbage()?何時以及爲何要使用它?
- 15. 瞭解何時以及爲什麼要使用不同的Android線程
- 16. 何時以及爲什麼我們需要使用COM?
- 17. 何時以及爲什麼要使用ClassName:this(null)?
- 18. 何時以及爲什麼要使用C#訪問方法
- 19. 何時以及爲什麼要使用namedtuple而不是字典?
- 20. 何時以及爲什麼要在Ruby中使用Loop構造
- 21. 何時以及爲什麼要使用getResources()?
- 22. 何時以及爲什麼要使用load_host_keys和load_system_host_keys?
- 23. 何時以及爲什麼要使用performSelector - iOS
- 24. 何時以及爲什麼要在代碼中使用位域?
- 25. 何時以及爲什麼要使用Django開發服務器?
- 26. 何時以及爲什麼要使用initWithNibName:bundle:在開發中
- 27. 何時以及爲什麼要使用JumboEnumSet
- 28. 何時以及爲什麼要在Matlab中使用cellfun?
- 29. 何時以及爲什麼要使用域服務?
- 30. 何時以及爲什麼要在node.js中使用斷言?
感謝您的回覆。之間,我嘗試了以下代碼:#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
關於[C語言選項](http://goo.gl/z0Piy)的GCC文檔列出'gnu89'/'gnu90'是默認的(在版本4.6.2以及許多其他版本中)。 'gcc -v'來檢查你的版本,'cpp -dM dev/null'來查找預定義的頭文件。 _GNU_SOURCE沒有定義,因此gcc手冊解釋了默認允許不與ANSI/ISO標準衝突的擴展。 '_GNU_SOURCE'也允許修改或衝突ANSI/ISO標準的GNU擴展。 – mctylr 2012-01-25 22:09:28
關於「便攜式功能的改變的功能」:我有興趣在不同的功能測試宏下找到具有不同聲明的函數的示例,並且發現一個:[mmap根據POSIX合規性級別聲明不同,至少在Solaris ](http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html?printOnly=1)。 – hmijail 2017-02-18 00:19:03