- ベストアンサー
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(); というようなことは可能でしょうか。
- みんなの回答 (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"); } -------------------- になってて「構文的に正しく、エラーになっていない」ですから、コンパイル&実行が可能です。 つまり「インクルードには、ヘッダファイルとかソースファイルとかの区別は一切無く、また、メインもサブも区別は一切無い」のです。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
もちろんヘッダファイルじゃなくてもインクルードできる. というか, プリプロセッサ自身は「ヘッダファイル」だとか「ソースファイル」だとかいうことは全く気にせず, ただひたすらインクルードするだけ. (コメントや条件コンパイルに制限はあるけど) 「全体として正しい C プログラム」になればいい. で #2 だけど, このままでは main.c が「全体として正しい C プログラム」にならないからアウト. もちろんそれをさらに別のファイルからインクルードして, そっちが「全体として」正しくなるなら OK.
お礼
早速の回答ありがとうございます。 とてもわかりやすい説明です。 eclipseのCDTでビルドすると「multiple definition~」というエラー出るので、何か制限があるのかと思い、投稿しましたが制限はないということなので、おそらく自分のコードがおかしいと思うので見直してみます。 ありがとうございました。