7

I have a question about the member variables of static struct in C language.

Someone said we can declare a static struct, but in C, struct do not have the static members like class in C++, what does this mean? If I declare a static struct, what is the status of the members variable? can some one help me on this?

4

3 に答える 3

10

静的構造体自体は、構造体の静的メンバーとは異なることに注意してください。静的構造体変数を宣言できますが、次のようにします。

static struct MyStruct s;

静的メンバーで構造体型を定義することはできません。

struct MyStruct {
    static int i; // <- compiler error
};

その理由は、C では構造体が型であるためです。その型の複数のインスタンスに対して、メンバー変数が常に同じインスタンス (つまり、静的) である型を宣言することは、まったくナンセンスです。C++ では、構造体は実際にはクラス (メンバーのデフォルトの可視性スコープのみが異なります) であり、C++ では static キーワードはこの場合別の意味を持ちます。これはクラス メソッドを意味しますが、C にはクラスとメソッドがないため、これは意味がなく、C では無効です。

教訓: C++ は C ではありません。

于 2012-08-27T08:49:48.600 に答える
4

staticCの意味:

  • プログラムには、この変数のインスタンスが 1 つだけ存在する必要があります。
  • 変数は、プログラムの実行中ずっと有効である必要があります。
  • この変数は、main() が実行される前に初期化されます。プログラマーが変数を明示的に初期化する場合は、この値に設定する必要があります。それ以外の場合は、ゼロに設定する必要があります。
  • 変数 (または静的関数) は、内部で宣言されているスコープからのみアクセスできます。ファイル スコープ (グローバル) で宣言されている場合、同じ .c ファイル内でのみアクセスできます。

C++ では、もう 1 つの意味があります。

  • 静的メンバー変数またはメンバー関数は、割り当てられるクラスのインスタンスの数に関係なく、1 回だけ割り当てられます。
于 2012-08-27T09:50:41.263 に答える
4

C言語の静的構造体のメンバ変数について質問があります。

静的構造体を宣言できると誰かが言った

正しい/合法:

// (global scope)
static struct t_struct {
    int a;
} THE_STATIC_VARIABLE;

しかし、C では、struct は C++ の class のような静的メンバーを持ちません。

// (global scope)
struct t_ill_struct {
    static int a; // << ill-formed in C, but valid in C++
};

これは何を意味するのでしょうか?静的構造体を宣言すると、メンバー変数のステータスはどうなりますか? 誰かがこれについて私を助けることができますか?

上記の例を使用するTHE_STATIC_VARIABLEと、静的ストレージがあることを意味します。以下は同等です。

// (global scope)
static struct t_struct {
    int a;
} THE_STATIC_VARIABLE;

B

// (global scope)
struct t_struct {
    int a;
};

static struct t_struct THE_STATIC_VARIABLE;

つまり、THE_STATIC_VARIABLEの定義を参照するすべての翻訳は、独自のコピーを取得します。

静的 C++ メンバーと同じ効果が必要な場合は、別のスコープ (構造体の宣言の外) で宣言する必要があります。

// file.h

// (global scope)
struct t_struct {
    int a;
};

extern struct t_struct THE_GLOBAL_VARIABLE;

// file.c
struct t_struct THE_GLOBAL_VARIABLE;

これで、C++ のように 1 つだけになりました。

于 2012-08-27T09:09:50.453 に答える