2015-03-13 207 views
1

我正在使用QT Creator在Ubuntu上創建一個C++程序。我編寫的程序編譯得很好,直到我決定開始使用C++ 11而不是C++ 98(這是QT Creator中的默認設置)。我用我自己的cmake的文件,而不是qmake的,所以要做到這一點,我包括在我CMakeLists.txt file以下行:從C++ 98升級到C++ 11會導致錯誤

set(CMAKE_CXX_FLAGS "-std=c++0x") 

現在,我的代碼部分具有以下(這不是我寫的):

#if (linux && (i386 || __x86_64__)) 
# include "Linux-x86/OniPlatformLinux-x86.h" 
#elif (linux && __arm__) 
# include "Linux-Arm/OniPlatformLinux-Arm.h" 
#else 
# error Unsupported Platform! 
#endif 

轉移到C++ 11後,我在線路error Unsupported Platform!得到一個錯誤。這是因爲,從我所看到的變量linux沒有在任何地方定義,雖然定義了變量__x86_64__

因此,我有兩個問題:

1)爲什麼變量linux沒有定義,即使我使用Linux呢?

2)如何告訴C++ 11忽略這個錯誤?

謝謝。

+1

你試過只使用不添加''__arm__' linux'? – 2015-03-13 12:12:32

+0

這不起作用,因爲'linux'在任何地方都沒有定義。我也嘗試用'unix'替換'linux',但那還沒有定義。 – Karnivaurus 2015-03-13 12:14:58

+0

是'set(CMAKE_CXX_FLAGS「-std = C++ 0x」)'唯一的改變嗎?除非你依賴非標準行爲,否則大多數C++ 98代碼應該在C++ 11中編譯得很好。 – NathanOliver 2015-03-13 12:15:48

回答

0

將標準選擇標誌更改爲-std=gnu++0x而不是c++0xgnu風格提供了一些非標準擴展,顯然包括預定義宏linux。或者,請檢查__linux__

5

標識符linux不保留。一致性編譯器可能不會將其預定義爲宏。例如,這個程序:

int main() { 
    int linux = 0; 
    return linux; 
} 

是完全有效的,並且符合的編譯器必須接受它。預定義linux會導致聲明成爲語法錯誤。

一些較早的編譯器(包括您正在使用的編譯器以及您提供的選項)會預定義某些符號以提供有關目標平臺的信息 - 包括表示Linux系統的linux。這個約定可以追溯到早期的C編譯器,這是在保留和未保留標識符之間存在區別之前編寫的。

標識符__linux__,因爲它有兩個下劃線開始,保留供實施使用,所以編譯器被允許預先定義它 - 在Linux系統的編譯器一般都預先定義它擴展到1宏。

確認您的編譯器預先定義了__linux__,然後更改您的代碼,以便測試__linux__而不是linux。您還應該知道使用了什麼保留符號而不是i386(可能爲__i386__)。

相關:Why does the C preprocessor interpret the word "linux" as the constant "1"?

相關問題