2012-10-09 55 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)。