- ベストアンサー
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} のように配列を定義する方法は存在するのでしょうか? どなたか良い方法を御存じの方、ご教授お願いします。
- みんなの回答 (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(){ .... こんな感じです。
その他の回答 (3)
- te20
- ベストアンサー率35% (14/40)
#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]; でいかがでしょうか。
お礼
ご回答ありがとうございます。 やりたいのは1でした。 まだextern static 等の使いわけが理解できていなかったようです。 これを期にべんきょうしなおします。 有難うございました。
- redfox63
- ベストアンサー率71% (1325/1856)
#defineで定義してどのように使うのでしょう? まさか #define MAX (2) #define A[MAX] { 20,30 } とどこかで定義して int foo() { int nSum = 0; // ここでコンパイルエラー ・・・ 変数名の未定義 // または nSumが期待した期待ではない物になる ... 50以外 nSum = A[0] + A[1]; return nSum; } といった使い方なんてしませんよね ・・・ #defineは プリプロセス段階で置換されてしまいますよ
お礼
有難うございます。 ご指摘の通り最初これで失敗しました。 #define の限界に気づきました。 C++ではdefineを使わない方がいいとされてるらしいですが、ここら辺のことも関係して来ているのでしょうか?
- yaemon_2006
- ベストアンサー率22% (50/220)
お礼
ありがとうございます。 よくみかけていたのですが何となくやりすごしていました。 このようにつかうのですね。勉強になりました
お礼
ていねいに有難うございます。 extern でなく GLOBALで定義する方法もあるのですね べんきょうになります。