
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);
}
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);
}
No.4
- 回答日時:
#3の補足をします。
>グローバル変数をstatic修飾すると、スコープがファイルに制限される為。
ファイルに制限されるのではなく、正確には翻訳単位で制限される為。です。
No.3
- 回答日時:
#1 ですが、以下の通りに修正します。
//------------define.c------------------
#include "define.h"
int a=10;
int b=20;
//----
グローバル変数をstatic修飾すると、スコープがファイルに制限される為。
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);
}
これまで重複定義とかに悩まされていたのですが、#defineするときはこういうふうにすれば良さそうですね。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語で2000年以降カレンダーを...
-
c言語でAからZまでを表示する...
-
【C】fizzbuzzのトリッキーなコ...
-
strcmp
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
コマンドラインに出力した文字...
-
8人分のテストの点数を入力し、...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
(C言語)めちゃくちゃな値にな...
-
cshの文字列操作(0埋め)
-
テキストカーソル位置の取得
-
コマンドプロンプトがすぐ消える
-
printfの出力内の文字をdefine...
-
scanfに文字が入力されたときに...
-
台形の面積を求めるプログラム
-
改行について 1行に何個かづ...
-
WM_CLOSEで閉じれないウィンド...
おすすめ情報