2016-06-15 7 views
0

GUIライブラリを開始するときに、Cで複数の構造体を扱っています。私は構造体を初期化する方法を決定するのが難しい時があります。ここでは2例は以下のとおりです。宣言時または別の関数で構造体を初期化する

#define GUI_CreateBox(PageName,x,y,z,w,h,color) \ 
    struct GUI_BOX BoxName = {x,y,z,w,h,color} 

または

static void GUI_InitBox(struct GUI_BOX *box,uint32_t x, ... uint32_t color) 
{ 
    init code 
} 

私の質問は1つが少なくともコード空間を使用した、ありますか?私はその機能がより良いと思った。私は定義を使用したかったので、それはstructポインタを複数回逆参照するよりもはるかに速いためです。私は構造体の初期化がどのように機能しているのか理解しておらず、続行する前に第二の意見を求めていました。

皆さんはどう思いますか?

また、背景情報もあります。私はARM Cortex M-4デバイスを開発する予定です。私は素敵な図書館が欲しい。

+0

単純なイニシャライザを使用し、関数にすべてのフィールドを渡すためのオーバーヘッドを考慮して、単純なイニシャライザを使用し、その関数をまったく呼び出さない可能性が最も低いスペースは、パラメータをフィールドに格納する以外は何もしません。それ以外の場合、あなたの質問は広すぎます。これはディスカッションフォーラムではありません。 – Olaf

+0

両方を試してみましょう。実際にどの作品がベストであるかを見てみましょう。それはこのレベルで推論することが可能であるよりも多くの要因に依存します。 – Notlikethat

+0

おそらく、 'PageName'パラメータと' BoxName'変数は、(マクロ初期化子の中で)同じものであることを意図しています。 –

答えて

0

これらの初期化のうち、どのくらいのものをやっていきますか?これらの初期化にはいくつのバリエーションがありますか?それはあなたに最も少ないコードを与えるものに影響を与えるかもしれません。グローバル(ファイル)スコープの変数に適用する必要があるのはどれですか?ファイルスコープでマクロを使用できます。ファイルスコープで関数を使用することはできません。関数の本体内で関数呼び出しを行う必要があります。これは、「変数がいつ初期化されたか」についての質問にもつながります。

GUI_CreateBox(box1, 23, 45, 20, 30, 20, COLOUR_BLUE); 

が、機能バージョンは、あなたが書くことができますを意味します:マクロバージョンはあなたが書く意味

注意また、あなたの構造を初期化しないという選択肢を残し

struct GUI_Box box2; 
GUI_InitBox(&box2, 23, 45, 20, 30, 20, COLOUR_GREEN); 
…some code using box2… 
GUI_InitBox(&box2, 32, 54, 2, 3, 2, COLOUR_PURPLE); 
…more code using box2… 

を。それは良い考えではないかもしれません。

あなたの選択。それらの間で選択することはあまりありません。

あなたはあまりにも文字通りの化合物を検討するかもしれない:

#define GUI_INITBOX(x, y, z, h, w, c) \ 
    (struct GUI_BOX){ .x = (x), .y = (y), .z = (z), .h = (h), .w = (w), .color = (c) } 

を次にあなたが書くと思います:

struct GUI_BOX box1 = GUI_INITBOX(23, 45, 20, 30, 20, COLOUR_BLUE); 

を宣言し、初期化し、あなたが書くことができるために:に

struct GUI_BOX box2; 
…code…; 
box2 = GUI_INITBOX(23, 45, 20, 30, 20, COLOUR_GREEN); 

を後でbox2を割り当てる(初期化しない)。複合リテラル(および指定された初期化子)はC99の一部であり、したがってC11の一部です。

+0

私は一度だけ初期化する必要がありますが、これらのオブジェクトは数百まであります。ほとんどの構造体はx、y、w、h、およびポインタで同じです。私は類似点を使って物事を動かすためのvoidポインタ関数を作成しました。私はコードサイズが大きいので、コードが増えることがわかりました。初期段階で初期化が行われるので、最終的には問題になるかどうかは分かりません。したがって、初期化の遅い関数に対処できるかもしれません。 –

0

あなたは初期化するつもりはないが、一度これを考慮する必要があります。コードサイズに関する限り、初期化ルーチンには割り当てが1つしかないため、マクロは小さくなります。また、関数呼び出しを使用する必要もなく、束や引数を渡す必要もなく、スタックサイズとスループットを節約できます。

しかし、あなたが考慮する必要がある主なものは、あなたのライブラリを使用する人の数です。私は多くのマクロで構成されているライブラリを人々が使用するとき、これを数回実行しました。あなたの引数には保護(パラメータ型のチェック)がありません。これは明らかにオブジェクトの初期化につながります。

だけでは、その点については、私は常に安全の側に誤るだろうし、関数内でこれをやって行く、あなたは

ことを考える場合は特にそして、あなたが計画している場合、これは、あなたの例には適用されませんがマクロのような関数で単一のパラメータを複数回再利用すると、引数で操作を行うことを好む人には予期せぬ副作用が発生する可能性があります。

関連する問題