3

ユーザーが有効な方向を通過するたびに常に正しい状態 (CA、AL など) の文字列が表示されるように、このコードを書き直すにはどうすればよいですか。

つまり、実行時よりもコンパイル時の方が enum の方向で enum_types のそれぞれに有効な case ステートメントがあることを確認するにはどうすればよいですか?

為に。例えば。私は意図的に East のケースステートメントをコメントアウトしました。コンパイル時にこれをキャッチする方法はありますか。

これが言語がデフォルトのケースを提供する理由であり、したがってこれは不可能かもしれないという私の直感は(いいえ)です。しかし、私はこれを専門家に任せます。

#include <iostream>
#include <string>

using namespace::std;

typedef enum 
{
    min_dir = -1,
    north,
    south,
    east,
    west,
}directions;

directions get_direction( string user_choice)
{
    if(user_choice == "north")
    {
        return north;
    }
    else if (user_choice == "south")
    {
        return south;   
    }
    else if (user_choice == "east")
    {
        return east;    
    }
    else if (user_choice == "west")
    {
        return west;    
    }
    else 
    {
        return min_dir;
    }
}

int main()
{
    string user_direction;
    cout << "Enter direction\n";
    cin >> user_direction;

    directions my_dir = get_direction(user_direction);
    cout << " Print direction's description\n";

    if( my_dir == min_dir)
    {
        // User passed junk
        return -1;
    }

    switch(my_dir)
    {
    case north:
        cout << "North - New york\n";break;
    case south:
        cout << "South - Alabama\n";break;
//  case east:
//      cout << "East - North Carolina\n";break;
    case west:
        cout << "West - California\n";break;
    default:
        cout << "Should Ideally never get here\n";break;
    }
    system("pause");
    return 0;
}

編集:これは要点を説明するための単なる例です。これは、作業中のコード用です。彼らはこれを Windows (MSVC) と Linux (gcc) の両方でコンパイルしました。これは単なる警告でしょうか?より厳しい取り締まりが必要です。

列挙型に case ステートメントがない場合、make プロセス中にエラーになるコードを書くことはできますか?

4

2 に答える 2

5

GCC (g++) と Clang には があります。これは、対象の型に可能な値-Wswitch-enumがない場合に警告します(ケースがある場合でも)。caseenumswitchdefault

MSVC には、警告レベル 3 に相当するC4062defaultがありますが、ステートメントがある場合は警告しません。その場合に警告が必要な場合は、レベル 4 の警告C4061を有効にする必要があります。これは、既定のケースが指定されている場合でも、列挙値が欠落している場合に警告を生成します。

エラーにする限り、すべてのコンパイラには「警告をエラーとして扱う」オプションがあります。GCC と Clang では、-Werror; MSVC では、/WX.

于 2012-11-13T01:56:21.650 に答える
1

列挙型にサイズ設定され、宣言時に初期化されるファンクターの配列を使用する場合は、配列のサイズと列挙型の数に対して static_assert を実行して、すべてのメンバーが存在することを確認できます。関数ポインターではなく配列でファンクターを使用することにより、各ファンクターが構築されるため、nullptr を値として指定していないことも確認できます。

typedef enum 
{
    min_dir = -1,
    north = 0,
    south,
    count_dir
}directions;

class GoDir
{
public:
    virtual void operator()() {}
};

class GoNorth : public GoDir
{
public:
    virtual void operator()() {}
};

class GoSouth : public GoDir
{
public:
    virtual void operator()() {}
};

static GoDir actions[count_dir] = {GoNorth(), GoSouth()};
static_assert(sizeof(actions)/sizeof(actions[0]) == count_dir, "Error");
于 2012-11-13T02:22:42.320 に答える