- ベストアンサー
Cコンパイル時のマルチデファイン優先
Cコンパイル時にincludeファイルの都合上、マルチデファインになってしまいます。 この点はコンパイラが宣言無視をしてくれるのですが、extern優先にしてリンクをするにはどのようにすれば良いのでしょうか。 ファイル内でinclude文(ファイル内)定義より先にextern文でシンボル定義をすれば、extern優先でリンクしてくれるのでしょうか(試して無いのですが)。 コンパラ・リンカ製品の仕様になるのでしょうけれど「マルチデフは絶対ダメ」なコンパイラでない場合、extern宣言を優先にする一般的な方法はありますか 。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
extern宣言を優先にしたいけれど、 プログラム中でひとつは実体を定義しないといけないわけですね? (問題を勘違いしてたらすみません) >ファイル内でinclude文(ファイル内)定義より先にextern文でシンボル定義をすれば、 >extern優先でリンクしてくれるのでしょうか。 というよりも、 ヘッダファイルの中には実体定義を書かないのが基本です。 ヘッダファイル内のグローバル変数は (program.h)---- extern int global_x; ------------ だけにしておいて、 どれかひとつの.cファイルで ------------ #include "program.c" int gloval_x; ----------------- のように実体を定義します。 これでリンクすれば実体がひとつに定まります。 プリプロセッサを使った有名な手法があります。 参考URLの『パソコン初心者の館』の 『Cプログラミング診断室』 →第5章 →「ほとんど同じ」 のところに、マクロを使った技が書いてあります。 なお、同じ著者の本『Cプログラミング専門課程』にも 手法が記されています。(第9章「ヘッダーファイル」) いい本なので買っておくといいと思います。 (ヘッダーファイルの多重インクルードを防ぐ手法も書いてます)
その他の回答 (1)
- liar_adan
- ベストアンサー率48% (730/1515)
#1です。 そういう事情でしたか。苦労を知らずに失礼しました。 しかしどうしたらよいかはちょっと思いつきません。 ヘッダーファイルから、extern宣言のみを抜き出して 新しいヘッダーファイルを作ればなんとかなるでしょうが、 もとのヘッダーファイルが複雑すぎるときは現実的でないし…。 (役に立たなくてすみません)
お礼
当面、面倒ですけど型宣言のマルチ定義で対応できそうです。 作法知らずがメインを作ると厄介の上乗せですね。 御回答ありがとうございました。
お礼
御回答ありがとうございます。 使用しているコンパイラなのですが。 メーカ専用機向けの上、アメリカ製->商社->メーカ->商社->サービス。 となっており融通が悪いのです。 メーカは言い訳をしてから説明をするし(なっていない)、include文を変更したくてもメンドウすぎるのです。 つまり、 <<ヘッダファイルの中には実体定義を書かないのが基本です。>> ここから「なってない」提供を受けているため、ややこしいのです。 パソコン上、マイクロソフトCのようにいかない。 そのためいままでは、分割コンパイルをしない利用方法か、外部定義includeファイルを定義作成するしかないという(プログラマーの作成した)プログラムをメンテしているのです。 それを私は無理に分割コンパイルで参照externしているため上記の問題が発生しております。