Namaran

Code daily. Without assist.

2026-09-15

run_command.cpp

#include <iostream>
#include <string>

void run(char cmd) {
    switch (cmd) {
    case 'h':
        std::string msg = "help";
        std::cout << msg << '\n';
        break;
    case 'q':
        std::cout << "quit\n";
        break;
    }
}

このコードはコンパイルできません。何が問題で、どう直せばよいでしょうか?

Answer

switchの本体は1つのブロックなので、msgのスコープはcase 'q':以降にも続いています。cmd == 'q'のときmsgの初期化を飛び越えて、そのスコープの中へジャンプすることになり、C++ではこれが禁止されています(int n = 1;のような単純な初期化でも同じです)。caseの中身を波括弧で囲み、msgのスコープをそこで閉じれば直ります:

case 'h': {
    std::string msg = "help";
    std::cout << msg << '\n';
    break;
}