• ベストアンサー

define で 配列

#defineで配列を定義したいのですがこのようなことは可能でしょうか? ヘッダファイル(test.h)で #define MAX (2) int A[MAX]={20,30}; ソースファイルで #include <stdio.h> #include "test.h" int main(){ int i; for(i=0;i<MAX;i++){ printf("A[%d]=%d\n",i,A[i]); } return 0; } とやれば出来るのですが、このヘッダファイルを複数のソースで参照すると 多重定義であるとおこられてしまいます。 #defineで #define A[MAX] {20,30} のように配列を定義する方法は存在するのでしょうか? どなたか良い方法を御存じの方、ご教授お願いします。

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

  • ベストアンサー
回答No.4

#define でではなく、共通して使う配列(なり変数)をただひとつのヘッダファイルで定義する方法でしょうか。 既に回答がありますが、同じ実体を持つ変数を複数の箇所(同じヘッダファイルを include する複数の箇所である場合も)で宣言する場合、 ・実体を宣言する部分には単純な宣言が ・それ以外の部分には(実体が他にあるということを明示するために) extern が必要です。 これを解決するテクニックのひとつに以下のようなものがあります。 test.h 内で #if defined(_GLOBAL_HERE) #defien GLOBAL #define DEF(x) = x #else #defien GLOBAL extern #define DEF(x) #endif #define MAX 2 GLOBAL int A[MAX] DEF({2, 3}); メインのソースファイル内で ソースファイルで #include <stdio.h> #define _GLOBAL_HERE #include "test.h" int main(){ int i; for(i=0;i<MAX;i++){ printf("A[%d]=%d\n",i,A[i]); } return 0; } それ以外のソースファイル内で (メインのソースファイル内以外の場所では、_GLOBAL_HERE を定義しない) #include <stdio.h> #include "test.h" int foo(){ .... こんな感じです。

runjump
質問者

お礼

ていねいに有難うございます。 extern でなく GLOBALで定義する方法もあるのですね べんきょうになります。

その他の回答 (3)

  • te20
  • ベストアンサー率35% (14/40)
回答No.3

#defineは単なる文字列の置き換えなので、これを使って配列の定義はできません。また、includeは単にファイルを展開するだけなので、test.hを読み込んだそれぞれのファイルで同じ名前のA[]を定義するので、多重定義になります。 で、やりたいことは次のどちらでしょうか? 1.A[]という配列をプログラム全体で一つ宣言して、それぞれのファイルの関数からアクセスしたい(配列Aはプログラム全体で1つ)。この場合は、 /* test.h */ #define MAX (2) extern int A[]; /* main.c */ #include <stdio.h> #include "test.h" int A [MAX]; 2. test.hをインクルードしたそれぞれのファイルごとに配列Aを宣言したい(配列Aはファイルごとに別々) /* test.h */ #define MAX (2) static int A[MAX]; でいかがでしょうか。

runjump
質問者

お礼

ご回答ありがとうございます。 やりたいのは1でした。 まだextern static 等の使いわけが理解できていなかったようです。 これを期にべんきょうしなおします。 有難うございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

#defineで定義してどのように使うのでしょう? まさか #define MAX (2) #define A[MAX] { 20,30 } とどこかで定義して int foo() {   int nSum = 0;   // ここでコンパイルエラー ・・・ 変数名の未定義   // または nSumが期待した期待ではない物になる ... 50以外   nSum = A[0] + A[1];   return nSum; } といった使い方なんてしませんよね ・・・ #defineは プリプロセス段階で置換されてしまいますよ

runjump
質問者

お礼

有難うございます。 ご指摘の通り最初これで失敗しました。 #define の限界に気づきました。 C++ではdefineを使わない方がいいとされてるらしいですが、ここら辺のことも関係して来ているのでしょうか?

回答No.1
runjump
質問者

お礼

ありがとうございます。 よくみかけていたのですが何となくやりすごしていました。 このようにつかうのですね。勉強になりました

関連するQ&A