我最近修改一些代碼,並發現了一個函數內的某行的預先存在的錯誤:什麼是'std :;'在C++中做?
std:;string x = y;
此代碼仍然編譯和預期一直在努力。
字符串定義可以工作,因爲這個文件是using namespace std;
,所以std::
是不必要的。
問題是,爲什麼std:;
正在編譯以及它在做什麼?
我最近修改一些代碼,並發現了一個函數內的某行的預先存在的錯誤:什麼是'std :;'在C++中做?
std:;string x = y;
此代碼仍然編譯和預期一直在努力。
字符串定義可以工作,因爲這個文件是using namespace std;
,所以std::
是不必要的。
問題是,爲什麼std:;
正在編譯以及它在做什麼?
std:
其標籤,可用作goto
的目標。
正如@Adam Rosenfield發表評論,它是一個合法的標籤名稱。
C++ 03第6.1節/ 1:
標籤有自己的名字空間,不影響其他標識符。
這是一個合法的轉到標籤? –
@JohnDibling:當然,爲什麼不呢? –
由標準保留? –
它是一個標籤,後跟一個空語句,後跟一個字符串x
的聲明。
它的後面是字符串
(expression)std: (end of expression); (another expression)string x = y;
語法上,它實際上是一個'(標籤 - )語句',而不是'表達式'。 – GManNickG
哦,是的,你是對的我的意思是他們分開.. – Polymorphism
編譯器會告訴你是怎麼回事標籤:
#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
)。
@Xeo:他在問題中說'他使用了命名空間std;'。 –
@Fred:Derp!那部分沒有標記爲代碼,所以我只是忽略了它。 :)我仍然想指向[這個問題](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c),然而。 – Xeo
相同的原因,'http:// www.stackoverflow.com'編譯... –