- ベストアンサー
分割コンパイルの初歩
C言語ですが、.hに実装を書くのは避けたほうが良いといわれます。 私は main.c define.h aaa.h bbb.h みたいなスタイルでコードを書いていました。 まずdefine.hでグローバル変数や、マクロなどの宣言を まとめて行い、ほかの.hやmain.cでも使えるようにして いました。 しかし、以下のような状況のとき、どのように分割すれば 良いのかが分かりません・・・。 たとえば、以下のように、マクロNUM、変数a,bをすべてのファイルで共有して使えるように分割コンパイルするにはどのようにコードを書き直せば良いのでしょうか? //--------------main.c------------------ #include "define.h" #include "aaa.h" #include "bbb.h" int main( void ){ printf("%d", a); printf("%d", b); printf("%d", NUM); aaa(); bbb(); return 0; } //------------define.h------------------ #define NUM 100 int a = 10; int b = 20; void aaa( void ); void bbb( void ); //------------aaa.h------------------ void aaa( void ){ printf("%d", a); printf("%d", b); printf("%d", NUM); } //------------bbb.h------------------ void bbb( void ){ printf("%d", a); printf("%d", b); printf("%d", NUM); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じではどうですか? //--------------main.c------------------ #include "define.h" int a = 10; int b = 20; int main( void ){ printf("%d", a); printf("%d", b); printf("%d", NUM); aaa(); bbb(); return 0; } //------------define.h------------------ #define NUM 100 void aaa( void ); void bbb( void ); //------------aaa.c------------------ #include "define.h" extern int a; extern int b; void aaa( void ){ printf("%d", a); printf("%d", b); printf("%d", NUM); } //------------bbb.c------------------ #include "define.h" extern int a; extern int b; void bbb( void ){ printf("%d", a); printf("%d", b); printf("%d", NUM); }
その他の回答 (3)
- keibou21
- ベストアンサー率31% (18/58)
#3の補足をします。 >グローバル変数をstatic修飾すると、スコープがファイルに制限される為。 ファイルに制限されるのではなく、正確には翻訳単位で制限される為。です。
- krisc
- ベストアンサー率57% (12/21)
#1 ですが、以下の通りに修正します。 //------------define.c------------------ #include "define.h" int a=10; int b=20; //---- グローバル変数をstatic修飾すると、スコープがファイルに制限される為。
- krisc
- ベストアンサー率57% (12/21)
*.hには宣言を。 *.cには実装を。 //--------------main.c------------------ #include "define.h" #include "aaa.h" #include "bbb.h" int main( void ) { printf("%d", a); printf("%d", b); printf("%d", NUM); aaa(); bbb(); return 0; } //------------define.h------------------ #ifndef NUM #define NUM 100 #endif extern int a; extern int b; //------------define.c------------------ #include "define.h" static int a=10; static int b=20; //------------aaa.h------------------ #include "define.h" void aaa( void ); //------------aaa.c------------------ #include "aaa.h" void aaa( void ) { printf("%d", a); printf("%d", b); printf("%d", NUM); } //------------bbb.h------------------ #include "define.h" void bbb( void ); //------------bbb.c------------------ #include "bbb.h" void bbb( void ) { printf("%d", a); printf("%d", b); printf("%d", NUM); }
お礼
これまで重複定義とかに悩まされていたのですが、#defineするときはこういうふうにすれば良さそうですね。ありがとうございます。
お礼
なるほど・・。外部変数を使うときはextern宣言すればよかったんですね。大変参考になりました。