チカラの技術

電子工作やプログラミング

グローバル変数の便利な宣言方法

久方ぶりです。
最近はメディアプレイヤーのプログラムをもっと拡張や変更をしやすい形に
再設計して作り直そうとしています。

○良いプログラミング
再設計に当たって今のグチャグチャなコードからちょっとでも
見通しの聞くプログラムにしたいと思いました。
そのために色々な本を読んでいるのですが、とても良い本を見つけたので報告します。
「改訂新版 Cプログラミング診断室」
 リンク

この本では上級プログラマーの著者が駄目プログラムの欠点や改善方法を
丁寧に解説してくれています。
的確な駄目出しが自分にもブスブス刺さり、とても勉強になります。

こんなやり方があったのか
上記の書籍の中にグローバル変数の宣言方法について解説がありました。
解説を一回読んだだけでスッと理解できなかった事と、とても素晴らしいテクニックだと思ったので
ここに備忘録として残そうと思います。
組み込みソフトでは割り込みとのデータのやりとりをするために、
どうしてもグローバル変数が多くなりがちですので有用だと思います。

グローバル変数の宣言を一つにせよ!
グローバル変数は定義部と宣言部に分かれます。
ソースファイル「.c」で定義、ヘッダファイル「.h」でextern宣言を行い、
このとき各々のファイルに変数名と型を記述します。

しかし、これでは変数名や型の変更が有った時に両方を修正しなければなりません。
これを一つにまとめる事が出来ると便利です。


○具体的な方法
まずヘッダファイルを下記のように記述します。
イメージ 1

マクロ処理で「Extern」の役割を変えています。
そしてグローバル変数の宣言で「extern」の代わりに「Extern」を使用しています。

このヘッダをincludeしてグローバル変数を利用するアプリケーションコードからは
「Extern」が「extern」=宣言として機能します。

次にグローバル変数の定義の為に以下のソースファイルを記述します。
イメージ 2

記述はこれだけです。
このソースファイルからヘッダを取り込むと、マクロ処理により「Extern」は「」(未定義)になります。
つまりヘッダファイルの12行目は「int global_value;」=定義文として解釈されます。

このテクニックを使えばコードの変更箇所がヘッダファイルのみとなり保守性が向上します。