我最近修改一些代码,并发现了一个函数内的某行的预先存在的错误:什么是'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'编译... –