CとC++のenumのスコープ 質問する

CとC++のenumのスコープ 質問する

C では enum が定義されているブロックの外部から enum 値にアクセスできるのに、C++ ではアクセスできないのはなぜですか?

次の C プログラムを考えてみましょう。

#include <stdio.h>
struct mystruct
{
    enum {INT, FLOAT, STRING} type;
    int integer;
    float floating_point;
} tu;

/* Why is INT accessible here? */
int main()
{
    tu.type = INT;
    tu.integer = 100;
    return 0;
}

C でコンパイルして正常に実行できます。

しかし、C++ ではコンパイルに失敗します。

#include <iostream>
struct mystruct
{
    enum {INT, FLOAT, STRING} type;
    int integer;
    float floating_point;
} tu;

/* Why is INT accessible here? */
int main()
{
    tu.type = INT;
    tu.integer = 100;
    return 0;
}

[エラー] 'INT' はこのスコープでは宣言されていません

C と C++ では列挙型とスコープのルールは異なりますか?

ベストアンサー1

C では、列挙型と構造体のスコープに関するルールはまったくありません。列挙型を定義する場所は重要ではありません。

C++ では、何かの中に別の何かを定義し (クラス内の列挙型など)、その何かを別の何かに属させます。

C++ で enum をグローバルにしたい場合は、クラスの外部で定義するか、構造体パスからアクセスする必要があります。

#include <iostream>
struct mystruct
{
    enum {INT, FLOAT, STRING} type;
    int integer;
    float floating_point;
} tu;

int main()
{
    tu.type = mystruct::INT; // INT is not in global scope, I have to precise it.
    tu.integer = 100;
    return 0;
}

注記:structこの例では、すべてがデフォルトでを使用しているため、これが機能publicします。注意が必要です。列挙型がスコープ内にある場合にのみ、構造体またはクラスの外部から列挙型と値にアクセスできます (public任意のフィールドまたは関数として)。

おすすめ記事