2009-12-20 80 views
18

我遇到了一個gcc v3.4.4的錯誤,以及在我的代碼中放置了一個#ifdef來解決只有該版本的編譯器的錯誤。什麼是編譯器版本號的gcc預定義宏?

什麼是GCC編譯器預處理器預定義的宏來檢測編譯器的版本號?

+1

可能的重複[如何測試當前版本的GCC?](http://stackoverflow.com/questions/259248/how-do-i-test-the-current-version-of-gcc),通用C/C++ – 2014-09-17 14:53:15

回答

26

從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)) 
+1

在預處理宏的末尾缺少權限paren? – user318904 2014-08-11 19:57:41

+0

是我還是鐺有相同的\ GNU \ _ \ _定義?所以不是一個真正的測試gcc? – Bram 2016-08-31 20:23:48

15

__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的|少

+4

GCC預先指定的預處理器指令的好處。排序時更好: 'gcc -E -dM - Bart 2013-08-07 10:57:35

+0

謝謝你的提示 - 運行''gcc -E -dM - Phil 2016-11-09 14:40:03

1

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__
該宏展開爲一個字符串常量,它描述在用編譯器的版本。您不應該依賴其具有任何特定形式的內容,但可以指望至少包含發行版號。

4

有針對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的

相關問題