我最近修改了一些代码,在一个函数的一行中发现了一个预先存在的bug:
std:;string x = y;
此代码仍然可以编译,并且一直按预期工作。字符串定义可以工作,因为这个文件是using namespace std;,所以std::从一开始就是不必要的。问题是,std:;为什么要编译,如果有的话,它在做什么?
using namespace std;
std::
std:;
wgxvkvu91#
std:是一个标签,可用作goto的目标。正如 @Adam Rosenfield 在评论中指出的那样,这是一个法律的的标签名称。
std:
goto
标签有自己的名称空间,不会干扰其他标识符。
t30tvxxf2#
它是一个标签,后面跟着一个空语句,后面跟着一个字符串x的声明。
x
busg9geu3#
它是一个标签,后面跟着字符串
b1uwtaje4#
(expression)std: (end of expression); (another expression)string x = y;
bnlyeluc5#
编译器会告诉你发生了什么:
#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)。
-Wall
5条答案
按热度按时间wgxvkvu91#
std:
是一个标签,可用作goto
的目标。正如 @Adam Rosenfield 在评论中指出的那样,这是一个法律的的标签名称。
标签有自己的名称空间,不会干扰其他标识符。
t30tvxxf2#
它是一个标签,后面跟着一个空语句,后面跟着一个字符串
x
的声明。busg9geu3#
它是一个标签,后面跟着字符串
b1uwtaje4#
bnlyeluc5#
编译器会告诉你发生了什么:
GCC和Clang都给予了非常明确的警告:
本故事的要点:编译代码时始终启用警告(例如
-Wall
)。