Lesimyの備忘録

忘れっぽい脳のための忘備録

enumの名前空間

2022-10-07 16:50:07 | C言語

C言語においては名前空間があるが、他の言語に比べて良くも悪くもフラットだ。

 

例えば複数の enum で同じ列挙子は使えない。

enum a { AAA, BBB, CCC };
enum b { BAB, BBB, BCB };

こんなコードを書くと BBB が競合してエラーになる。

結局長い名称を付けてユニークな名称にするしか回避策は無い。 構造体の中に無名でenumを入れ子にしても名前空間が同じなので競合は避けられない。言語使用なので仕方ない。


volatile

2020-06-13 10:08:50 | C言語

valatile や const は対象がポインタの場合に記述する位置により効果が異なる。

A) volatile int* aaa; // ポインタの指し示す先の内容に対して効力をもつ。
B) int* volatile aaa; // ポインタ(アドレス)に対して効力をもつ。

 

A)ではポインタ変数 aaa が例えば 0x00000100に割り当てられてその中身が 0x00008000である場合、アドレス0x00008000の内容に効果がある。

B)ではポインタ変数 aaa が例えば 0x00000100に割り当てられてその中身が 0x00008000である場合、0x00008000に効果があるのが B)である。

 

デバイスドライバや組み込みなどでは重大な意味を持つ。通常は A)のようにしてポインタ先に対して最適化されないようにする。デバイスのレジスタ等で外的要因により変化する場合や、割り込み内で書き換えるなどのケースでは最適化されると意図した動作にならずバグで悩むこことなる。