2018/04/24

[c]初期化用マクロを用意するとき

protobuf-cを見ているときだったが、構造体の初期化をするのに、関数とマクロの2つが用意されていた。
関数はアドレスを渡せばどこでも初期化できるのだが、マクロは構造体のインスタンス宣言に代入する形でないと使えない。


言葉で書くとわかりづらいので、コードにしておこう。

01: typedef struct {
02:   int a;
03:   const char *b;
04: } aaa_t;
05: 
06: #define INIT_AAA    { 0, NULL }
07: 
08: void init_aaa(aaa_t *val)
09: {
10:    val->a = 0;
11:    val->b = NULL;
12: }


マクロの場合は、構造体の初期化に限定した書き方になるので、宣言時の代入でしか使用できない。
C++であればコンストラクタで済ませられるのだが、Cではどうしようもない。


「じゃあ、初期化関数だけでいいやん」と私は思っていたのだ。
明示的に初期化したのが分かるし、そんなに面倒な書式ではない。


そう思って、自作のライブラリでもそうしていたのだが・・・だんだん嫌になってきた。
例えば、上記のコードを使うと、こうなる。


aaa_t     a;
init_aaa(&a);


大したことは無い。
では、こうなってきたらどうだ。


int k = 0;
aaa_t    a1;
aaa_t    a2;
bbb_t    b;
ccc_t    c;
char *str = NULL;

init_aaa(&a1);
init_aaa(&a2);
init_bbb(&b);
init_ccc(&c);


こういう混在が続いてくると、初期化するものが続いているときには、その場で初期化するようにした方が間違いが少ないんじゃなかろうか、という考えが芽生えてきたのだ。


おじさんでも、芽生えるときは芽生えるのだ。
ただ、それが良い方向かどうかは分からんがね。
「コードリーティング」を読んだ方が良いのかもなぁ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。