• ベストアンサー

分割コンパイルの#defineについて

分割コンパイルで ファイル1 #include <stdio.h> #define number 10 char string[number]; int main(void){ string[0]='a'; string[1]='b'; file_to(); return 0; } ファイル2 #include <stdio.h> #define number 10 extern char string[number]; void file_to(void){ /***何かの処理をする*****/ } って感じなんですけども、配列string の中身の値をdefineによって指定しているのですが、片方のdefineの値を変更する時、もう一つのdefineも手動で変更しています。関係するファイル数が多くなってくると大変なので、どれかのdefineの値を変化させたら自動的に他のdefineの値も変更するプログラムの組み方はありませんか? 質問がわかりにくいかも知れませんがよろしくお願いします。

  • Nickee
  • お礼率79% (107/134)

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

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

#define 部分を mydef.h のようなファイルにまとめておき、各プログラムには、 #include "mydef.h" とすればよいです。 makeを使っている場合は、依存関係を追加したほうが楽です。例えば、a.cというファイルでmydef.hをincludeするなら、Makefileの中に a.o : mydef.h という行を追加しましょう。 蛇足ですが、<mydef.h>ではなく"mydef.h"と記述することで、システムのディレクトリーではなく、カレントディレクトリー中のファイルを探します。

Nickee
質問者

お礼

なるほど、ヘッダファイルの存在は以前から知っていたのですが、よくわからないまま、分割コンパイルに頼りきっていました。このような使い方があったのですね。ありがとうございました。

その他の回答 (1)

  • KOH_da
  • ベストアンサー率31% (161/506)
回答No.2

このプログラムがmaeda.cだとすると、 maeda.hというファイルを作ります。 そこには、 #define number 10 と、記述します。 そして、maeda.cには、 #include "maeda.h" と、記述して、maeda.hを取り込むようにします。 それ以外にもファイルがあって、 たとえば、それがhigashide.cとすれば、 higashide.cにも、 #include "maeda.h" と記述します。

Nickee
質問者

お礼

できました。ありがとうございました。

関連するQ&A

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • #defineで置き換えられない

    C言語です。詳しい方、よろしくお願いします。 下記のプログラムをコンパイルして実行したら、画像のようになってしまいます。 コンパイラは、CPad for LSI C-86 ver2.31です。 #include<stdio.h> #define clr() printf("\x1b[2J") void main(void) { while(1){ clr(); printf("test"); } } #defineがどうも置き換えられていないようです。 詳しい方、考えられる原因を教えてください。 よろしくお願いします。

  • 分割コンパイルの方法がわかりません‥(Studio.NET)

    mainとsubという2つのcppファイルと各ヘッダファイルで分割コンパイルを試みましたがうまくいきません・・。 何が間違っているのでしょう・・。 エラーメッセージ error LNK2005: "char * a" (?a@@3PADA)は既にmain.objで定義されています。 fatal error LNK1169: 1つ以上の複数回定義されているシンボルが見つかりました。 と表示されます。ファイルソースは以下です。どなたか教えてください>< ----------(main.h)---------- char a[100]; ----------(main.cpp)---------- #include<stdio.h> #include "main.h" #include "sub.h" int main(){  sprintf(a,"hello.");  sub_write();  return 0; } -----------(sub.h)----------- void sub_write(); -----------(sub.cpp)------------- #include <stdio.h> #include "main.h" #include "sub.h" void sab(){  printf("%s\n",a); } return; }

  • cコンパイルができません!!(>_<)

    void main (void) { ("kamiwasinda"); } というソースをex01.cという名前で保存して、コンパイルでコンパイルしたのですが、 インクルード ファイルstdio.hが見つかりません と表示されて、コンパイルできません!!!(>_<) どうすればコンパイルできるんですか?教えてください!!!

  • 分割コンパイルの初歩

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

  • Cコンパイル時のマルチデファイン優先

    Cコンパイル時にincludeファイルの都合上、マルチデファインになってしまいます。 この点はコンパイラが宣言無視をしてくれるのですが、extern優先にしてリンクをするにはどのようにすれば良いのでしょうか。 ファイル内でinclude文(ファイル内)定義より先にextern文でシンボル定義をすれば、extern優先でリンクしてくれるのでしょうか(試して無いのですが)。 コンパラ・リンカ製品の仕様になるのでしょうけれど「マルチデフは絶対ダメ」なコンパイラでない場合、extern宣言を優先にする一般的な方法はありますか 。

  • コンパイルできない・・。(VC++初心者です)

    VC++初心者です。 MS VC++6.0を使用しています。 プロジェクト(Win32 console application)を新規作成して,以下のソースファイル2つとヘッダファイル1つを作成して,コンパイルしたところ インクルード ファイルがオープンできません。'kneko.h': No such file or directoryとエラーが表示されます. 3つのファイルがリンクできてないのでしょうか? また,ヘッダファイルを選択,表示させてコンパイルしようとすると kneko.h の拡張子に関連したコンパイラツールがないためにコンパイルできないと警告されます。 どこが間違っているのでしょうか?よろしくおねがいします。 test.cpp ------------------------------------------------- #include <iostream> #include <cstdio> #include "kneko.h" using namespace std; int main(){ kneko x( "tama" ); x.naku(); } ------------------------------------------------- kneko.h ------------------------------------------------- #ifndef __kneko_h #define __kneko_h #include <iostream> #include <string> using namespace std; class kneko { string name; public: kneko(){}; kneko( string n ); void setname( string n ); void naku() const; }; #endif ------------------------------------------------- kneko.cpp ------------------------------------------------- #include "kneko.h" kneko::kneko( string n ){ name = n; } void kneko::setname( string n ){ name = n; } void kneko::naku() const { cout << "My name is " << name << "." << endl; } -------------------------------------------------

  • 複数ファイルに分割した時の構成について

    大学の卒論にむけてプログラムを書いていて、一つのmain.cでは長くなってきたので、関数を func1.h func1.c のような別ファイルに記述することにしました。 その現在の構成を、質問欄の下部に簡単に書いたので、構成が自然かどうか意見をお聞きしたいです。特に、 「include文、define文をヘッダファイルにまとめて、各ファイルからincludeしている構造」がコードの記述方法として、きもちわるくないか、一般的かどうか、教えてください。 このようにした理由は、 ・defineマクロを多くのサブ関数で利用している。 ・define定義の値を細かく変えながら実行し、結果の違いを出力したい。 ・その為、各ファイルの頭にdefine定義を置いた場合、定義の値を  いちいち全てのファイルで変更しなければならなくなり、面倒…。 →defineマクロをdefine.hにまとめた。ついでに、<stdio.h>,<math.h>なども置いてしまえばスッキリするかも~。 という経緯です。 理学の学科でまわりに詳しい人がいなく、 プログラム知識もほぼ独学なので、不安に感じて質問しました。 よろしくおねがいします。 +++++++++++++ 以下が、簡単なファイル構成です +++++++++++++ -----define.h----- #include <stdio.h> #include <math.h> #define A_MAX 3 #define B_MAX 5 -----main.c---- #include "define.h" int main() { func1(); func2(); func3(); } -----func1.h---- #include "define.h" void func1(int hoge); //プロトタイプ宣言 -----func1.c---- #include "func1.h" void func1() { hogehoge; } ------func2以下、func1と同構造

  • CGIコンパイルエラーについての質問

    CGIコンパイルエラーについての質問 gcc ppp.c -o pppとコンパイルしたらerrorが出てしまいます io.h そのようなファイルやディレクトリは存在しませんとでます CentOS Vware Playerを使っています #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <io.h> #include <time.h> void showimg(char []); int main(void) { int no; char *imgfile[] = {"img1.jpg","img2.jpg","img3.jpg"}; srand((unsigned int)time(NULL)); no = rand() % 3; printf("Content-type: image/jpeg\n\n"); showimg(imgfile[no]); return 0; } void showimg(char imgfile[]) { FILE *fp; char buf[1024]; int i, size; fp = fopen(imgfile, "rb"); if(fp != NULL) { _setmode(_fileno(stdout), _O_BINARY); while((size = fread( buf, sizeof(unsigned char), 1024, fp )) != 0) { for(i = 0 ; i < size ; i++) { printf("%c", buf[i]); } } fclose(fp); fflush(stdout); _setmode(_fileno(stdout), _O_TEXT); } } このプログラムを正しくコンパイルできて画像をランダムに表示できるようにしたいです どなたかお教えください

    • ベストアンサー
    • CGI
  • 分割

    下記のプログラミングを Makefileを利用して分割コンパイルしたいのですが、 分割の仕方からコンパイルまで全くわからなくて手が付けられません。 どなたかよろしくお願いします。 #include <stdio.h> #include <string.h> void write_profile(FILE *fp) { double height, weight; char name[100]; printf("名前を入力してください:"); scanf("%s", name); printf("身長を入力してください:"); scanf("%lf", &height); printf("体重を入力してください:"); scanf("%lf", &weight); fprintf(fp, "Name:%s, Height:%f, Weight:%f\n", name, height, weight); printf("ファイルに書き込みました。\n"); } int main(void) { FILE *fp; fp = fopen("profile", "a"); while(1){ write_profile(fp); fclose(fp); } return(0); }