2017-05-27 16 views
7

Próbowałem skompilować the code z opcją C++ 14:Czy <algorithm> definiuje makro X?

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

int main() 
{ 
    return 0; 
} 

Ale otrzymuję błąd po X:

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

Nie rozumiem błąd z opcją C++ 98. Z moją wersją 4.8.4 gcc, nie dostaję błędu, ale z 5.4.0 robię. Czy to błąd? Czy robię coś nie tak?

+0

Brak błędu z gcc6 – vsoftco

+0

[Nie można odtworzyć] (https://godbolt.org/g/Xv0ksm) z podanym kodem. Jeśli chodzi o to, czy definiuje makro, można sprawdzić dokumentację - tak nie jest. – DeiDei

+0

Dlatego właśnie podałem link. Jeśli jest to błąd, to dostawca połączony może użyć wersji zagrożonej. Więc @DeiDei, czy to błąd i wszystko dobrze zrobiłem? Jeśli tak, proszę, proszę, odpowiedz na to. – DanielTuzes

Odpowiedz

8

Ten sam błąd występuje w mojej lokalnej instalacji g ++ 5.4.0. Spojrzałem na wyjściu g++ -E i wydaje ślady błędach /usr/lib/gcc/x86_64-linux-gnu/5/include/ia32intrin.h linie 252 i 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 
} 

Można to uznać błąd w bibliotece dołączonej do kompilatora, ponieważ niezarezerwowane #define s nie powinny być z nimi w konflikcie. (Inne funkcje w tym samym nagłówku używają parametru __X.)

+2

Dlatego właśnie preprocesor jest zły. – DeiDei

+0

To jest błąd. Biblioteka standardowa nie może używać żadnych identyfikatorów, z wyjątkiem zarezerwowanych, właśnie z tego powodu. Stephan T. Lavavej kiedyś dał namiętny monolog o długościach, które muszą przejść w implementacji STL, aby upewnić się, że działa we wszystkich narożnych przypadkach (zakładają, że użytkownicy są źli i zrobią każdą dziwną rzecz dozwoloną w ramach standardu, nie są w błędzie) . Makra zdefiniowane przez użytkownika są łatwe w obsłudze (po prostu nie używaj nazw takich jak X); typy zdefiniowane przez użytkownika z przeciążonymi operatorami powodują większy ból. –

+0

To rodzi interesujące pytanie. Czy istnieje sposób na ochronę moich nagłówków _own_ przed takimi makrami zdefiniowanymi przez użytkownika? –