ページ 1 / 1
コンパイル中のファイル名による分岐
Posted: 2008年8月27日(水) 23:52
by ルファー
ヘッダーファイルに
"現在コンパイル中のファイルが「main.c」でなければ、グローバル変数の宣言に「extern」修飾子をつける"
っていうことはできますか?
[余談:VC++2005のプリコンパイル済みヘッダーとかいうやつの有無で何が違うの]
Re:コンパイル中のファイル名による分岐
Posted: 2008年8月28日(木) 00:38
by たかぎ
C言語の仕様の範囲では無理です。
どうしてもやりたければ、ツールを自作してコンパイル前に通すか、m4のようなマクロプロセッサで代用するなどしてください。
Re:コンパイル中のファイル名による分岐
Posted: 2008年8月28日(木) 08:18
by toyo
プリコンパイル済みヘッダーを使うとコンパイル時間が短縮されます。
それだけです。
Re:コンパイル中のファイル名による分岐
Posted: 2008年8月28日(木) 21:47
by ルファー
やっぱりファイル名で分岐は無理なんですね。
ありがとうございます。
[そうかコンパイル時間が短くなるのか]
Re:コンパイル中のファイル名による分岐
Posted: 2008年8月28日(木) 21:54
by たかぎ
> やっぱりファイル名で分岐は無理なんですね。
はい。C言語の仕様の範囲では無理です。
今回やろうとしていることは大体想像が付きますが、その程度であれば、ファイル名で分岐させる必要はないでしょう。
ただ、もっと有意義な目的で必要になった場合には、C言語の仕様外の方法で実現することはできるということです。
Re:コンパイル中のファイル名による分岐
Posted: 2008年8月28日(木) 23:10
by 翡翠
え~と、ここの龍神録プログラミングの館の5章、「宣言の仕方を工夫しよう」に、その方法が書いてあります
私もあの方法を使わせて頂いてます
C++ならできるのですが、たかぎさんの仰るように、C言語では使えないのかもしれません
Cで試していないのですみませんが、私にはこれ以上わかりません
参考になれば
Re:コンパイル中のファイル名による分岐
Posted: 2008年8月29日(金) 02:25
by たかぎ
> C++ならできるのですが、
C++でもできません。
現在コンパイル中のファイルがmain.cであるかどうかは、__FILE__マクロを調べるしかありません。
しかし、__FILE__マクロは文字列リテラルですので、#ifで判別することはできません。
C++の場合でも、文字列リテラルの内容をテンプレート引数に与えることは出来ませんので、静的な判別は不可能です。
また、仮に出来たとしても、externの有無を切り替える方法はありません(もし、#ifで判別できるのであれば可能)。
コンパイルの前にm4に通せば、__file__マクロをifの中で比較できますので、望みのことができます。
Makefileのルールを少し変えてやるだけで済むので、割と簡単です。
Re:コンパイル中のファイル名による分岐
Posted: 2008年8月29日(金) 12:10
by 翡翠
すみません、ちょっと説明が少なすぎたようです
龍神録プログラミングのやり方では、ファイル名で分岐をしているのではありません
第五章の転載ですが、
#ifdef _GLOBAL_INSTANCE_
#define GLOBAL
#else
#define GLOBAL extern
#endif
GLOBAL int img;
と書かれていますが、これは
「_GLOBAL_INSTANCE_が定義されていればGLOBALという文字は空白に置き換えられる」
「_GLOBAL_INSTANCE_が定義されていなければGLOBALという文字はexternに置き換えられる」
という意味です
そして、
#define _GLOBAL_INSTANCE_
をメインファイルに書き足せば、メインファイルから呼ばれた時は変数の宣言となり、他のファイルから呼ばれた時は extern が付くことになります
より詳しい説明は実際に五章をご覧になって下さい
ええと、質問がファイル名で判別できるか、という問いに対する答えとしては間違っていると思いますが、やりたい事は上記の答えで解決できる……はずです
>たかぎさん
質問が、ファイル名を判別するにはどうすればいいか、ということでしたね
これについては、私の説明不足・認識違いでした
どうもすみませんでした
Re:コンパイル中のファイル名による分岐
Posted: 2008年8月29日(金) 17:50
by たかぎ
第五章のGLOBALマクロについては分かっています。
この手の方法は、実際にはあまりお勧めではありません。
グローバル変数は、絶対使うなとまではいいませんが、使うかどうかは慎重に検討する必要があります。
そのためには、あえて記述を面倒にしておいた方が得策だったりします。