重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/07/25 00:43

#3の補足をします。


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

#1 ですが、以下の通りに修正します。



//------------define.c------------------
#include "define.h"

int a=10;
int b=20;

//----

グローバル変数をstatic修飾すると、スコープがファイルに制限される為。
    • good
    • 0

*.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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/07/25 00:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!