5
#include<stdio.h>
struct str 
{ 
   static int a ;
    int b ;
 } s ;
int main()
{
static int p , k ;
printf("%d %d",sizeof(p),sizeof(s));
getchar();
return 0;
}

上記のコードはエラーを出しています。しかし、構造体の最初のメンバーを「static int」ではなく「int」に再定義すると、正常に動作します。構造体で静的メンバーが許可されていない理由とその重要性は何ですか?

4

5 に答える 5

0

いいえ、Cではありません。C++でこれを実行できると思います。つまり、構造のすべてのインスタンス間で共有されるコピーが1つあるということです。astruct str

Cで同様のことをしたい場合は、いくつかのオプションがあります(もっとあるかもしれませんが、現時点ではそれらについて考えることはできません)。

1つ目は、次のような共通変数を分割することです。

int struct_str_static_a;
struct str {
    int b;
} s;

このように、構造のすべてのインスタンスで共有されるコピーは1つだけです。a各インスタンスは、引き続き独自のコピーを取得しますb

これに対するわずかな変更は、その共通変数へのポインターを導入し、ポインターを初期化することです。

int struct_str_static_a;
struct str {
    int *pA;
    int b;
} s;
:
s.pA = &struct_str_static_a;

次に*(s.pA)、以前使用していた場所を使用できますs.a。のすべてのインスタンスには、単一のを指すstruct str独自のポインタがあるため、同様の効果が得られます。しかし、それは続くべき困難な道です。pAa

3番目のオプションは、次のISO Cワーキンググループに参加し、これを言語の変更として提案することです。しかし、それは今後10年ほどの間、あなた自身からかなりの努力を必要とするでしょう、おそらく努力の価値はありません:-)

于 2012-08-08T06:22:36.640 に答える
0

ここに良い答えがあります:http://cboard.cprogramming.com/c-programming/123691-static-variable-structure.html

一般的に言って、静的と宣言しても何のメリットもありませんが、それでも必要な場合は、c ++に移行するか、構造体全体を静的として宣言することができます。

于 2012-08-08T06:23:00.320 に答える
0

言語はそれを許可しません。それがデザインの一部ではないということ以外に、より深い理由はありません。次のように、別のグローバル変数を使用して、常に同じ動作を実現できます。

struct str
{
    int b;
} s;

int str_a;

type のすべてのオブジェクトの別個のサブ要素となるstaticを構造体内に持つことは、まったく異なることに注意してください。int a;struct str

(C から進化した言語である C++ では、静的クラス メンバーが存在し、上で説明した回避策とまったく同じように動作することにも注意してください。ただし、グローバル変数の名前がクラスの名前に密接に関連付けられているだけです。)

于 2012-08-08T06:20:59.347 に答える