我遇到了一個gcc v3.4.4的錯誤,以及在我的代碼中放置了一個#ifdef來解決只有該版本的編譯器的錯誤。什麼是編譯器版本號的gcc預定義宏?
什麼是GCC編譯器預處理器預定義的宏來檢測編譯器的版本號?
我遇到了一個gcc v3.4.4的錯誤,以及在我的代碼中放置了一個#ifdef來解決只有該版本的編譯器的錯誤。什麼是編譯器版本號的gcc預定義宏?
什麼是GCC編譯器預處理器預定義的宏來檢測編譯器的版本號?
從GNU CPP手冊...
__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
這些宏由使用C預處理所有GNU編譯定義:C,C++,Objective-C和Fortran的。它們的值是編譯器的主版本,次版本和補丁級別,作爲整數常量。例如,GCC 3.2.1將把__GNUC__
定義爲3,__GNUC_MINOR__
至2,__GNUC_PATCHLEVEL__
定義爲1.如果您直接調用預處理器,也會定義這些宏。
__GNUC_PATCHLEVEL__
是GCC 3.0的新增功能;它也存在於廣泛使用的3.0版本的開發快照中(根據你擁有哪個快照,它們將自己標識爲GCC 2.96或2.97)。
如果您只需要知道您的程序是由GCC編譯還是由非GCC編譯器聲稱接受GNU C方言,那麼您可以簡單地測試__GNUC__
。如果您需要編寫取決於特定版本的代碼,則必須更加小心。每次次要版本增加時,修補程序級別都會重置爲零;每次主版本增加時(很少發生),次版本和補丁級別都會重置。如果您希望直接在有條件使用預定義宏,你需要把它寫這樣的:
/* Test for GCC > 3.2.0 */
#if __GNUC__ > 3 || \
(__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
(__GNUC_MINOR__ == 2 && \
__GNUC_PATCHLEVEL__ > 0))
在預處理宏的末尾缺少權限paren? – user318904 2014-08-11 19:57:41
是我還是鐺有相同的\ GNU \ _ \ _定義?所以不是一個真正的測試gcc? – Bram 2016-08-31 20:23:48
__GNUC__
,__GNUC_MINOR__
和__GNUC_PATCHLEVEL__
。
例如,GCC 4.0.1會做:
#define __GNUC__ 4
#define __GNUC_MINOR__ 0
#define __GNUC_PATCHLEVEL__ 1
這裏是一個小的命令行是不錯的,當你想知道這是本prede網絡斯內德預處理指令去連接由GNU GCC編譯器下定義記住你當前的編程環境:
GCC-E -dM - <的/ dev/null的|少
從online docs:C,C++,Objective-C和Fortran的:
__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
這些宏由使用C預處理所有GNU編譯器定義。它們的值是編譯器的主版本,次版本和補丁級別,作爲整數常量。例如,GCC 3.2.1會將__GNUC__定義爲3,__GNUC_MINOR__定義爲2,__GNUC_PATCHLEVEL__定義爲1.如果直接調用預處理器,也會定義這些宏。
和
__VERSION__
該宏展開爲一個字符串常量,它描述在用編譯器的版本。您不應該依賴其具有任何特定形式的內容,但可以指望至少包含發行版號。
有針對gcc版本,你可以測試3個宏。
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
__GNUC__
例如,我的gcc 4.3.1 v將它們定義爲這樣:
#define __GNUC_MINOR__ 1
#define __GNUC_PATCHLEVEL__ 3
#define __GNUC__ 4
就可以看到運行中定義的 「buitin」 宏
的gcc -E -dM -xc的/ dev/null的
可能的重複[如何測試當前版本的GCC?](http://stackoverflow.com/questions/259248/how-do-i-test-the-current-version-of-gcc),通用C/C++ – 2014-09-17 14:53:15