- ベストアンサー
C言語グローバル変数
C言語で、 aaa.c にglobal変数 gTest[2]; を書いて、 別のbbbb.cからgTest[0]の値を参照するにはどうしたらよいでしょうか? aaa.cとbbb.cは異なる機能なので、 bbb.cからgTest[0] の値を直接編集させたくありません。 aaa.hに gTest[2];を書くしかないのでしょうか? aaa.hに gTest[0]の値を取得するマクロを定義してbbb.cにはそのマクロを使ってもらいたいのですが、可能でしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
一番シンプルなのは、bbb.c に extern int gTest[]; と(型が int の場合)書いて、gTest[] の実体が外部にあることを教えてあげれば良いです。 ただし、この場合は、同じ gTest[] を aaa.c と bbb.c からアクセスするので、bbb.c からもgTest[] の書き換えが可能になります。 これを防ぐためには、変数に対してアクセスできるようにするのではなく、aaa.c に例えば、 int getTestValue(int n) { return gTest[n]; } のような関数を定義して、bbb.c からこの関数経由でgTest[] を参照すると、bbb.c からは gTest[] の書き換えはできなくなります。 さらに言えば、aaa.c における gTest[] の定義の時点で、 static int gTest[2]; としておけば、たとえ、bbb.c で extern int gTest[] と書いても、変数を直接参照することを禁止できます。 aaa.h に int gTest[2]; と書いて、aaa.c と bbb.c で include しても、「このままでは」 aaa.c と bbb.c の gTest[] は、「同じ名前の別々のもの」になる可能性が高いので、おすすめはできません。
その他の回答 (3)
- wormhole
- ベストアンサー率28% (1626/5665)
いっその事グローバル変数をやめてアクセス用の関数を用意する。
- Tacosan
- ベストアンサー率23% (3656/15482)
ど~せなら「const な値への const なポインタ」だとは思いますが>#2, それよりは関数の方が自然かなって気はする. もちろん「ソースコードの切り分けを考え直す」方がより良いのかもしれんが.
- yama1718
- ベストアンサー率41% (670/1618)
要するに、その変数(gTest)を他のモジュールからは読み出し専用で参照させて、書き換えをしない様にしたいのですよね。 それならconstポインタが使えると思います。 ポインタ変数にconst修飾子を付加すると、そのポインタが指す変数は読み出し専用になります。 ポインタのアドレス自体は変更可能ですので、gTestのアドレスにセットすれば期待通りになると思います。 http://www5f.biglobe.ne.jp/~fuku-labo/library/program/cpp/1/006.htm http://homepage2.nifty.com/tsugu/sotuken/const/ でもC言語のポインタは直接メモリアクセスにコンパイルされているので、コンパイル時にソース中でconstポインタ変数に代入している場所を見つけて警告やエラーで注意してくれる程度だと思います。 実行中もgTestのアドレスのメモリが完全に読み出し専用で保護されている訳ではありませんので、プログラムのミスや何かの拍子で他からの書き換えが起こる可能性はありますね。