2017-05-27 35 views
7

我試圖編譯the code與選項C++ 14:<algorithm>定義了一個宏X?

#define X static_cast<double>(2) 
#include <algorithm> 
// if you change the two lines, no error occurs 

int main() 
{ 
    return 0; 
} 

但我X後出現錯誤:

error: expected ',' or '...'

我沒有得到與選項C++ 98的錯誤。用我的gcc版本4.8.4,我沒有得到錯誤,但是我有5.4.0。這是一個錯誤?我做錯了什麼?

+0

gcc6沒有錯誤 – vsoftco

+0

[無法重現](https://godbolt.org/g/Xv0ksm)提供的代碼。至於是否定義了一個宏,您可以檢查文檔 - 它沒有。 – DeiDei

+0

這就是我提供鏈接的原因。如果它是一個錯誤,那麼鏈接的提供者可能會使用受影響的版本。所以@DeiDei,這是一個錯誤,我做得很好嗎?如果是這樣,請回答接受它。 – DanielTuzes

回答

8

我在我的本地g ++ 5.4.0安裝中遇到同樣的錯誤。我看着g++ -E輸出,而且似乎錯誤痕跡/usr/lib/gcc/x86_64-linux-gnu/5/include/ia32intrin.h線252和254:

/* Write flags register */ 
extern __inline void 
__attribute__((__gnu_inline__, __always_inline__, __artificial__)) 
__writeeflags (unsigned long long X) // 252 
{ 
    __builtin_ia32_writeeflags_u64 (X); // 254 
} 

這可以被認爲是編譯器捆綁庫中的一個錯誤,因爲非保留#define不應與它們衝突。 (其他功能使用參數__X。)

+2

這就是爲什麼預處理器是邪惡的。 – DeiDei

+0

這是一個錯誤。由於這個問題,標準庫不能使用任何標識符,除了保留標識符。 Stephan T. Lavavej曾經給出過一段激情獨白,說明他們必須在STL實施過程中保持長度,以確保它在所有角落案例中都能正常工作(他們假設用戶是邪惡的,並且會在標準中允許每件奇怪的事情發生;他們沒有錯) 。用戶定義的宏很容易處理(不要使用像X這樣的名稱);用戶定義的類型和重載操作符會帶來更多的痛苦。 –

+0

這引發了一個有趣的問題。有沒有辦法保護我的_own_標題免受這種用戶定義的宏問題? –