【问题标题】:What would 'std:;' do in c++?什么会'std:;'在 C++ 中做?
【发布时间】:2012-10-09 19:32:27
【问题描述】:

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

std:;string x = y;

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

字符串定义有效,因为这个文件是using namespace std;,所以std::一开始是不必要的。

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

【问题讨论】:

  • @Xeo:他在问题中说他有using namespace std;
  • @Fred:Derp!那部分没有标记为代码,所以我忽略了它。 :) 不过我还是想指出this question
  • http://www.stackoverflow.com 编译的原因相同...
  • 另一个不使用using namespace std;的理由:)
  • @KerrekSB 我的一个朋友在浏览 reddit 时发生了这种情况!原来链接是this :D

标签: c++ std colon


【解决方案1】:

std: 它是一个标签,可用作goto 的目标。

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

C++03 §6.1/1:

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

【讨论】:

  • AFAIK 标签有自己的命名空间,所以它们从不与其他任何东西冲突,当然,除了关键字或宏。
  • C++03 §6.1/1 说“标签有自己的命名空间,不会干扰其他标识符。”
  • 6.1/1:“标签有自己的命名空间,不会干扰其他标识符”
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      (expression)std: (end of expression); (another expression)string x = y;
      

      【讨论】:

      • 语法上,它实际上是(label-)statement,而不是expression
      【解决方案5】:

      编译器会告诉你发生了什么:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 2022-10-24
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        相关资源
        最近更新 更多