【问题标题】:Code before first case in switch statementswitch 语句中第一个 case 之前的代码
【发布时间】:2021-05-24 10:19:50
【问题描述】:

请注意,这是一个关于 C++ 语言的问题,而不是关于我用来说明它的示例的真实性或有用性。

假设我们在一个(或多个)命名空间中有一个enum

namespace SomeVeryLargeNamespaceExample {
    enum class E {
        One,
        Two,
    };
}

现在,我们想在switch 语句的表达式中使用它。今天发现可以在switch语句中添加using SomeVeryLargeNamespaceExample::E,在第一个case之前,减少cases中的代码混乱:

switch (e) {
    using SomeVeryLargeNamespaceExample::E;
case E::One:
    std::cout << "One\n";
    break;
case E::Two:
    std::cout << "Two\n";
    break;
}

乍一看还以为是某种从未了解过的“在任何case语句之前执行此操作”功能,但是有些表达式,例如函数调用,并没有执行(实际上,gcc会生成警告@987654330 @)。另一方面,可以声明变量(但不能初始化)。

我的问题是,还有哪些可能的说法?这是switch 的设计方式的一个功能还是仅仅是一个后果

注意:我找到了this other question,但它是特定于 C 的(所以它没有提到命名空间的情况,例如),我对 C++ 很好奇。

【问题讨论】:

    标签: c++ switch-statement


    【解决方案1】:

    任何有效的 C++ 语句都是可能的:

    int a;
    
    void foo(int x)
    {
        switch (x) {
            a=4;
        case 0:
            a=1;
            break;
        case 1:
            a=2;
            break;
        }
    }
    

    这是语法上有效的 C++,gcc 编译它并生成可执行文件没有问题。但是,当然,永远无法达到最初的声明。因此每个现代 C++ 编译器都会给你一个警告信息:

    t.C: 在函数'void foo(int)'中:

    t.C:8:18: 警告:声明将 永远不会被执行 [-Wswitch-unreachable]

    8 |                 a=4;
      |
    

    【讨论】:

    • 谢谢!有没有办法知道哪些语句会产生效果(如示例中的using)?我假设那些不会生成实际代码但会引导编译器的人,不是吗?
    • 你的假设是正确的。没有某种主列表,其中 C++ 语句不会生成代码。但是随着您继续学习 C++,您将了解每一个是什么。
    • @cbuchart • 它可以用于Duff's device 的实际用途,将do { 放在第一个case 之前。
    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2022-01-05
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    相关资源
    最近更新 更多