2012-10-09 56 views
89

我最近修改一些代碼,並發現了一個函數內的某行的預先存在的錯誤:什麼是'std :;'在C++中做?

std:;string x = y; 

此代碼仍然編譯和預期一直在努力。

字符串定義可以工作,因爲這個文件是using namespace std;,所以std::是不必要的。

問題是,爲什麼std:;正在編譯以及它在做什麼?

+1

@Xeo:他在問題中說'他使用了命名空間std;'。 –

+0

@Fred:Derp!那部分沒有標記爲代碼,所以我只是忽略了它。 :)我仍然想指向[這個問題](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c),然而。 – Xeo

+23

相同的原因,'http:// www.stackoverflow.com'編譯... –

回答

90

std:其標籤,可用作goto的目標。

正如@Adam Rosenfield發表評論,它是一個合法的標籤名稱。

C++ 03第6.1節/ 1:

標籤有自己的名字空間,不影響其他標識符。

+0

這是一個合法的轉到標籤? –

+0

@JohnDibling:當然,爲什麼不呢? –

+0

由標準保留? –

32

它是一個標籤,後跟一個空語句,後跟一個字符串x的聲明。

12

它的後面是字符串

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

語法上,它實際上是一個'(標籤 - )語句',而不是'表達式'。 – GManNickG

+0

哦,是的,你是對的我的意思是他們分開.. – Polymorphism

1

編譯器會告訴你是怎麼回事標籤:

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

GCC和鏗鏘給出一個非常明確的警告:

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

帶走這個故事:總是用warnin編譯你的代碼gs已啓用(例如-Wall)。