2013-03-12 9 views
12
void operator"" test(const char* str, size_t sz ) 
{ 
    std::cout<<str<<" world"; 
} 

int main() 
{ 
    "hello"test; 
    return 0; 
} 

W GCC 4.7, to generuje „Ostrzeżenie: dosłowny przyrostków operator nie poprzedzone«_»są zarezerwowane dla przyszłej normalizacji [włączoną domyślnie]”Czy można wyłączyć ostrzeżenie GCC o brakującym podkreśleniu w słowie zdefiniowanym przez użytkownika?

rozumiem dlaczego to ostrzeżenie jest generowany, ale mówi GCC " domyślnie włączone ".

Czy można wyłączyć to ostrzeżenie, nie wyłączając wszystkich ostrzeżeń za pomocą opcji -w?

+4

Wow, nie wiem, że C++ 11 obsługuje przeciążanie [operator ""] (http://ideone.com/ZDyCML). Nawiasem mówiąc, g ++ obecny w ideeku przynajmniej nie ostrzega, ale mój lokalny kompilator tak robi. Tylko dla informacji innych (którzy nie znają kontekstu), zmieniając 'test' na' _test' ostrzeżenie zniknie. – iammilind

+12

Dlaczego chcesz? Istnieje szansa, że ​​późniejsze wersje C++ będą zawierały potencjalnie sprzeczne symbole. To źle*. Problem GCC polega na tym, że nie daje on * błędu * tak jak powinien. –

+1

@Nicol, doceń swój komentarz i to ostrzeżenie rzeczywiście spowoduje błąd dla mnie, ponieważ używam -Werror. Mamy wiele cennych ostrzeżeń w GCC, ale nadal pozwalamy programistom na ich wyłączenie. – cmeub

Odpowiedz

4

Po przeczytaniu kilku komentarzy na to pytanie dokonałem przeglądu standardu C++ 11 (nieostateczny projekt N3337).

Kiedy powiedziałem: "Rozumiem, dlaczego generowane jest to ostrzeżenie", pomyliłem się. Zakładam, że podkreślenie nie było technicznie wymagane przez standard, ale tylko zalecenie (stąd ostrzeżenie zamiast błędu).

Ale jak Nicol Bolas został wychowany, a średnia wykorzystuje następujące języka mówiąc o zdefiniowane przez użytkownika literały „Literalne przyrostek identyfikatorów, które nie rozpoczynają się od znaku podkreślenia są zarezerwowane dla przyszłej normalizacji”

"Program zawierający taki sufiks ud jest źle sformułowany, nie wymaga diagnostyki."

Jest to podobne do języka używanego dla zarezerwowanych identyfikatorów i "alternatywnych reprezentacji", takich jak "i", "lub", "nie". Myślę, że to wyjaśnia, że ​​to nie powinno być ostrzeżenie, ale błąd.

To nie może być bezpośrednia odpowiedź na pytanie "czy można wyłączyć", ale jest to dla mnie wystarczająca odpowiedź.

Nicol, jeśli chcesz zgłosić swój komentarz jako odpowiedź, zmienię twój na zaznaczoną odpowiedź (myślę, że to możliwe).

Powiązane problemy