2012-10-09 12 views
89

Byłem niedawno modyfikowania kodu, i znalazł się istniejąca wcześniej błąd w jednej linii wewnątrz funkcji:Co by "std :," zrobić w C++?

std:;string x = y; 

Ten kod nadal kompiluje i działa zgodnie z oczekiwaniami.

Definicja łańcucha znaków działa, ponieważ plik ten jest using namespace std;, więc std:: był niepotrzebny w pierwszej kolejności.

Pytanie brzmi, dlaczego jest std:; kompilowanie i co, jeśli coś, to robi?

+1

@Xeo: Powiedział w pytaniu, że ma "using namespace std;'. –

+0

@Fred: Derp! Ta część nie została oznaczona jako kod, więc przeoczyłam to. :) Wciąż chciałbym wskazać [to pytanie] (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c), jednak. – Xeo

+23

Powód, dla którego 'http: // www.stackoverflow.com' kompiluje ... –

Odpowiedz

90

std: jest to etykieta, którą można wykorzystać jako element docelowy dla goto.

Jak wskazano jako @Adam Rosenfield w komentarzu, jest to nazwa legalnej etykiety.

C++ 03 §6.1/1:

Etykiety mają własną przestrzeń nazw i nie kolidują z innymi identyfikatorami.

+0

Czy jest to legalna etykieta goto? –

+0

@JohnDibling: Jasne, czemu nie? –

+0

Zarezerwowane przez standard? –

32

Jest to etykieta, po której następuje pusta instrukcja, a następnie deklaracja ciągu znaków x.

12

Jego label którym następuje ciąg

8
(expression)std: (end of expression); (another expression)string x = y; 
+4

W sensie gramatycznym, jest to w rzeczywistości wyrażenie '(etykieta-)', a nie "wyrażenie". – GManNickG

+0

O tak, masz rację, mam na myśli, że są oddzielone .. – Polymorphism

1

Kompilator mówi, co się dzieje:

#include <iostream> 
using namespace std; 
int main() { 
    std:;cout << "Hello!" << std::endl; 
} 

Zarówno gcc i brzęk dają bardzo wyraźne ostrzeżenie:

std.cpp:4:3: warning: unused label 'std' [-Wunused-label] 
    std:;cout << "Hello!" << std::endl; 
    ^~~~ 
1 warning generated. 

Odejście od tej historii: zawsze kompiluj kod za pomocą warnina gs enabled (np. -Wall).