構造内で宣言および定義された変数を特定の値に初期化できるかどうか疑問に思っていたのですが、関数ポインターを使用して OOP のクラスを模倣することを計画していました。
コード例:
typedef struct{
int x;
int (*manipulateX)(int) = &manipulateX;
}x = {0};
void main()
{
getch();
}
int manipulateX(int x)
{
x = x + 1;
return x;
}
構造内で宣言および定義された変数を特定の値に初期化できるかどうか疑問に思っていたのですが、関数ポインターを使用して OOP のクラスを模倣することを計画していました。
コード例:
typedef struct{
int x;
int (*manipulateX)(int) = &manipulateX;
}x = {0};
void main()
{
getch();
}
int manipulateX(int x)
{
x = x + 1;
return x;
}
C99 以降では、指定されたイニシャライザを使用して、次のように構造体のフィールドに値を設定できます。
struct MyStruct {
int x;
float f;
};
void test() {
struct MyStruct s = {.x=123, .f=456.789};
}
メモリがややタイトな組み込みシステムをプログラミングするときに使用したアプローチの1つは、いくつかのマクロを使用して、構造タイプとその初期値の両方を定義することでした。定義は次のようになりました。
#define CREATE_FOO_STRUCT \
X(int age, 34) Y \
X(int height, 65) Y \
X(char const * favoritecolor,"blue") Y \
X(int some_things[5],ARR5(1,2,3,4,5))
そのARR5
配列の初期化値を単一のパラメーターとして渡すことができるようにするには、マクロが必要でした。別の方法は、最後の行をとして書くことX(int some_things[5],{1 COMMA 2 COMMA 3 COMMA 4 COMMA5})
でした。上記のようなマクロが与えられた場合、returnsは最初の項目とセミコロンに展開され、構造を定義し、次に再定義して2番目の項目とコンマX
を返すY
ように定義することができます。この場合はデフォルトのインスタンス。最後の行が他の行と異なる必要があることを回避する方法がわからないのは残念です(各行の前に最初の行がある場合、最後の行は他の行と一致する可能性がありますX
Y
typedef {CREATE_FOO_STRUCT} FOO;
FOO
X
Y
X
Y
const FOO default_FOO = {CREATE_FOO_STRUCT};
X
、および最後の行の後に行が続く場合//this line must be left blank
。
上記の構成を実装した特定のプロセッサでは、default_FOO
そのように定義すると、RAMがゼロになり、のサイズに等しいROMが消費されdefault_FOO
ます。従来の代入ステートメントを使用して、の静的インスタンスをデフォルト値でロードする関数はFOO
、のゼロ以外のバイトごとに4バイトのROMを消費しdefault_FOO
、使用できる静的インスタンスが存在する必要もあります。を受け入れ、FOO*
指定されたインスタンスをデフォルト値でロードするC言語関数は、膨大な量のコードを必要とします(各割り当ては、格納されるデータのアドレスを個別に計算する必要があります)。
C の構造体テンプレート内で構造体メンバーを初期化することは違法であり、許可されていません..構造体テンプレートはそれ自体のメモリを保持せず、構造体のすべてのメンバーは、それらが関連付けられている場合にのみメモリ空間を割り当てられます。変数の構造体型であり、現在はメモリが割り当てられているため、初期化できます..ただし、変数に関連付ける前ではありません:例
struct tag_name
{
int x;
int y;
};
上記の構造体テンプレートは、変数が次のように関連付けられていない限り、メモリ空間を保持しません。
struct tag_name variable1;
構造体型の変数には、2 つの int 値 (と)variable1
を保持するのに十分な大きさのメモリが割り当てられ、メンバー x と y を次のように初期化できるようになりました。variable1.x
variable1. y
variable1.x=10;
variable1.y=20;
したがって、以下は違法になります
struct tag_name
{
int x=10;
int y=20;
};
StructName s; // receives no initialization
StructName s = {x,y}; // value initializes all members
struct Child { StructName s; };
Child c; // receives no initialization
Child c = {x,y}; // value initializes all members
For Example :
struct Child{
int c;
int d;
}
Child childstruct ={10,20};
その場合、childstruct.c は 10 になり、childstruct.d は 20 になります。