• ベストアンサー

分割コンパイルの初歩

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); }

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

  • ベストアンサー
  • pc88fr
  • ベストアンサー率28% (2/7)
回答No.2

こんな感じではどうですか? //--------------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); }

amazontester
質問者

お礼

なるほど・・。外部変数を使うときはextern宣言すればよかったんですね。大変参考になりました。

その他の回答 (3)

  • keibou21
  • ベストアンサー率31% (18/58)
回答No.4

#3の補足をします。 >グローバル変数をstatic修飾すると、スコープがファイルに制限される為。 ファイルに制限されるのではなく、正確には翻訳単位で制限される為。です。

  • krisc
  • ベストアンサー率57% (12/21)
回答No.3

#1 ですが、以下の通りに修正します。 //------------define.c------------------ #include "define.h" int a=10; int b=20; //---- グローバル変数をstatic修飾すると、スコープがファイルに制限される為。

  • krisc
  • ベストアンサー率57% (12/21)
回答No.1

*.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); }

amazontester
質問者

お礼

これまで重複定義とかに悩まされていたのですが、#defineするときはこういうふうにすれば良さそうですね。ありがとうございます。

関連するQ&A