• ベストアンサー

extern指定子と実装(#include)について

2点質問があります。 #1.#includeできるのはヘッダーファイルのみなのでしょうか。    ヘッダファイルをインクルードしなくてはいけないのは、わかっ   てます。.c(Cソースコード)はインクルードできないのでしょう   か。 #2.#1と絡んだことについてです。    たとえば、2つの関数Func1()とFunc2()とをメインルーチンと   は別のソースコードに関数の処理を記述したとします。    ファイル名:Func.c    中身:Func1とFunc2の処理内容    次にこれをメインルーチン内で使用するために以下のように記述   して保存したとします。    ファイル名:Func.h    中身:#include "Func.c" extern void Func1(void); extern void Func2(void); 最終的に、ファイル名:main.c         #include "Func.h" --------------- Func1(); Func2(); というようなことは可能でしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#includeに、ヘッダファイルやら何やらの区別はありません。 動作は「そこに書かれたファイル名のファイルの中身が、あたかも、そこにあるようにコンパイルされる」だけです。 なので、ファイルの中身が「コンパイル可能な文字列」である限り #include "foo.txt" と書こうが #include "bar.doc" と書こうが #include "mix.ccc" と書こうが #include "tom.hhh" と書こうが #include "tomato.ketchup" と書こうが、コンパイラは、すべてを許します。(もちろん、指定されたファイルが存在する事が大前提ですが) 極端な話 -------aaa.1-------- #include <stdio.h> -------------------- -------aaa.2-------- int main(void) -------------------- -------aaa.3-------- { -------------------- -------aaa.4-------- printf("hello world!\n"); -------------------- -------aaa.5-------- } -------------------- -------aaa.c-------- #include "aaa.1" #include "aaa.2" #include "aaa.3" #include "aaa.4" #include "aaa.5" -------------------- と書いて、aaa.cをコンパイルすれば、コンパイル出来てしまいます。 だって「インクルードされ、中身が展開された結果のaaa.c」は -------------------- #include <stdio.h> int main(void) { printf("hello world!\n"); } -------------------- になってて「構文的に正しく、エラーになっていない」ですから、コンパイル&実行が可能です。 つまり「インクルードには、ヘッダファイルとかソースファイルとかの区別は一切無く、また、メインもサブも区別は一切無い」のです。

yf491224
質問者

お礼

早速の回答ありがとうございます。 とてもわかりやすい説明です。 eclipseのCDTでビルドすると「multiple definition~」というエラー出るので、何か制限があるのかと思い、投稿しましたが制限はないということなので、おそらく自分のコードがおかしいと思うので見直してみます。 ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

もちろんヘッダファイルじゃなくてもインクルードできる. というか, プリプロセッサ自身は「ヘッダファイル」だとか「ソースファイル」だとかいうことは全く気にせず, ただひたすらインクルードするだけ. (コメントや条件コンパイルに制限はあるけど) 「全体として正しい C プログラム」になればいい. で #2 だけど, このままでは main.c が「全体として正しい C プログラム」にならないからアウト. もちろんそれをさらに別のファイルからインクルードして, そっちが「全体として」正しくなるなら OK.

関連するQ&A

専門家に質問してみよう