什么是std:;'在c++中做什么?

vlju58qv  于 2023-01-22  发布在  其他
关注(0)|答案(5)|浏览(260)

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

std:;string x = y;

此代码仍然可以编译,并且一直按预期工作。
字符串定义可以工作,因为这个文件是using namespace std;,所以std::从一开始就是不必要的。
问题是,std:;为什么要编译,如果有的话,它在做什么?

wgxvkvu9

wgxvkvu91#

std:是一个标签,可用作goto的目标。
正如 @Adam Rosenfield 在评论中指出的那样,这是一个法律的的标签名称。

  • C++03 §6.1/1:*

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

t30tvxxf

t30tvxxf2#

它是一个标签,后面跟着一个空语句,后面跟着一个字符串x的声明。

busg9geu

busg9geu3#

它是一个标签,后面跟着字符串

b1uwtaje

b1uwtaje4#

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

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)。

相关问题