コンパイル中のファイル名による分岐

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ルファー

コンパイル中のファイル名による分岐

#1

投稿記事 by ルファー » 17年前

ヘッダーファイルに
"現在コンパイル中のファイルが「main.c」でなければ、グローバル変数の宣言に「extern」修飾子をつける"
っていうことはできますか?

[余談:VC++2005のプリコンパイル済みヘッダーとかいうやつの有無で何が違うの]

たかぎ

Re:コンパイル中のファイル名による分岐

#2

投稿記事 by たかぎ » 17年前

C言語の仕様の範囲では無理です。
どうしてもやりたければ、ツールを自作してコンパイル前に通すか、m4のようなマクロプロセッサで代用するなどしてください。

toyo

Re:コンパイル中のファイル名による分岐

#3

投稿記事 by toyo » 17年前

プリコンパイル済みヘッダーを使うとコンパイル時間が短縮されます。
それだけです。

ルファー

Re:コンパイル中のファイル名による分岐

#4

投稿記事 by ルファー » 17年前

やっぱりファイル名で分岐は無理なんですね。
ありがとうございます。

[そうかコンパイル時間が短くなるのか]

たかぎ

Re:コンパイル中のファイル名による分岐

#5

投稿記事 by たかぎ » 17年前

> やっぱりファイル名で分岐は無理なんですね。

はい。C言語の仕様の範囲では無理です。
今回やろうとしていることは大体想像が付きますが、その程度であれば、ファイル名で分岐させる必要はないでしょう。
ただ、もっと有意義な目的で必要になった場合には、C言語の仕様外の方法で実現することはできるということです。

翡翠

Re:コンパイル中のファイル名による分岐

#6

投稿記事 by 翡翠 » 17年前

え~と、ここの龍神録プログラミングの館の5章、「宣言の仕方を工夫しよう」に、その方法が書いてあります

私もあの方法を使わせて頂いてます

C++ならできるのですが、たかぎさんの仰るように、C言語では使えないのかもしれません
Cで試していないのですみませんが、私にはこれ以上わかりません

参考になれば

たかぎ

Re:コンパイル中のファイル名による分岐

#7

投稿記事 by たかぎ » 17年前

> C++ならできるのですが、

C++でもできません。

現在コンパイル中のファイルがmain.cであるかどうかは、__FILE__マクロを調べるしかありません。
しかし、__FILE__マクロは文字列リテラルですので、#ifで判別することはできません。

C++の場合でも、文字列リテラルの内容をテンプレート引数に与えることは出来ませんので、静的な判別は不可能です。
また、仮に出来たとしても、externの有無を切り替える方法はありません(もし、#ifで判別できるのであれば可能)。

コンパイルの前にm4に通せば、__file__マクロをifの中で比較できますので、望みのことができます。
Makefileのルールを少し変えてやるだけで済むので、割と簡単です。

翡翠

Re:コンパイル中のファイル名による分岐

#8

投稿記事 by 翡翠 » 17年前

すみません、ちょっと説明が少なすぎたようです

龍神録プログラミングのやり方では、ファイル名で分岐をしているのではありません
第五章の転載ですが、


#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:コンパイル中のファイル名による分岐

#9

投稿記事 by たかぎ » 17年前

第五章のGLOBALマクロについては分かっています。

この手の方法は、実際にはあまりお勧めではありません。
グローバル変数は、絶対使うなとまではいいませんが、使うかどうかは慎重に検討する必要があります。
そのためには、あえて記述を面倒にしておいた方が得策だったりします。

閉鎖

“C言語何でも質問掲示板” へ戻る