0

デフォルトの初期化値で構造体を宣言する方法はありますか?

次のような構造体を定義するヘッダー ファイルがあります。

typedef struct struc_s
{
    size_t cost const = 2000;
    size_t dmg const = 100;
    size_t def const = 100;
    size_t hull const = 1500;
    size_t shield const = 300;
    size_t capacity const = 2;
    size_t destruc const = 10;
} struc_t;

しかし、これはもちろんうまくいきません。

struc_tこのヘッダー ファイルでvar 型を宣言する方法でも構いません。しかし、私が正しく覚えているように。次のようにcファイルでdecarereする必要がありますextern

私がやりたいことは、このヘッダーが含まれているすべての場所で実行できるようにすることvar = struc_s.dmgであり、その結果、var が値を保持する必要があります100。しかし、ヘッダー以外の場所で struc_s を宣言したくありません。この動作をアーカイブする方法はありますか?

4

2 に答える 2

1
typedef struct struc_s
{
int a;
int b;    
}s; 

これは型定義であり、オブジェクトの宣言ではありません。オブジェクトの宣言時に初期化できます。

C89 スタイルの初期化子は、連続したメンバーを指定できる場合に使用されます。

s obj={1,2}; 

不連続または順不同のメンバーリストの場合、指定された初期化子スタイルを使用できます

s obj={.a=1,.b=2};  

     or

s obj={.b=2,.a=1};

3 番目の方法は、同じ型の既存のオブジェクトの値をコピーすることです。

s obj1=obj;
于 2013-10-16T18:49:53.133 に答える
1

あなたが望む方法ではありません。

typedef を実行すると、メモリ領域の形状が定義されます。これは、メモリ領域を割り当てて埋めるのとは異なるプロセスです。

考えられる代替案:

typedef struct 
{
    size_t cost;
    size_t dmg;
    size_t def;
    size_t hull;
    size_t shield;
    size_t capacity;
    size_t destruc;
} struc_t;


#ifndef DEFAULT_STRUC_VALUES_DEFINED
#define DEFAULT_STRUC_VALUES_DEFINED 

const struc_t DEFAULT_STRUC = {
    .cost = 2000,
    .dmg = 100,
    .def = 100,
    .hull = 1500,
    .shield = 300,
    .capacity = 2,
    .destruc = 10
};
#endif

そして、新しいものを作成したいとき:

struc_t *new_struc = malloc(sizeof(struc_t));
memcpy(new_struc, DEFAULT_STRUC, sizeof(struc_t));

size_t補足として、構造体メンバーに使用している理由はありますか? 本質的に問題はありませんが、プラットフォームによって異なる場合があります。

于 2013-10-16T18:51:04.303 に答える