我最近正在修改一些代码,并在函数内的一行中发现了一个预先存在的错误:
std:;string x = y;
此代码仍可编译并且一直按预期工作。
字符串定义有效,因为这个文件是using namespace std;
,所以std::
首先是不必要的。
问题是,为什么要std:;
编译,如果有的话,它在做什么?
std:
它是一个标签,可用作goto
.
正如@Adam Rosenfield在评论中指出的那样,它是一个合法的标签名称。
C++03 §6.1/1:
标签有自己的名称空间,不会干扰其他标识符。
它是一个标签,后跟一个空语句,然后是一个字符串的声明x
。
它是一个标签,后面跟着字符串
(expression)std: (end of expression); (another expression)string x = y;
编译器会告诉你发生了什么:
#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
)。