什么会“ std :;” 用C ++做?


89

我最近正在修改一些代码,并在函数中的一行上发现了一个预先存在的错误:

std:;string x = y;

该代码仍然可以编译,并且按预期工作。

字符串定义有效,因为此文件是using namespace std;,因此std::首先不需要。

问题是,为什么要std:;编译?它在做什么(如果有的话)?


1
@Xeo:他在有问题的时候说using namespace std;
弗雷德·拉尔森

@弗雷德:德普!那部分没有被标记为代码,所以我只是忽略了它。:)不过,我仍然想指出这个问题
Xeo 2012年

23
http://www.stackoverflow.com编译的原因...
Kerrek SB 2012年

19
另一个理由不使用using namespace std;:)
大卫·罗德里格斯- dribeas

@KerrekSB在浏览reddit时发生在我的一个朋友身上!原来是这样的链接:D
mmirzadeh,2012年

Answers:


90

std:其标签,可用作的目标goto

正如@Adam Rosenfield在评论中指出的,这是一个合法标签名称。

C ++ 03§6.1/ 1:

标签具有其自己的名称空间,并且不会干扰其他标识符。


4
AFAIK标签具有其自己的名称空间,因此它们当然不会与关键字或宏以外的其他任何内容发生冲突。
rodrigo 2012年

11
C ++ 03§6.1/ 1说:“标签具有其自己的名称空间,并且不会干扰其他标识符。”
亚当·罗森菲尔德

6.1 / 1:“标签具有自己的名称空间,并且不会干扰其他标识符”
John Dibling 2012年



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

4
在语法上,它实际上是一个(label-)statement,而不是一个expression
GManNickG 2012年

1

编译器告诉您发生了什么:

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

gcc和clang都给出了一个非常明确的警告:

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

这个故事的意义:始终在启用警告的情况下编译代码(例如-Wall)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.