プロが教えるわが家の防犯対策術!

#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}
のように配列を定義する方法は存在するのでしょうか?

どなたか良い方法を御存じの方、ご教授お願いします。

A 回答 (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(){
....

こんな感じです。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/07/11 16:18

#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];

でいかがでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/11 16:20

#defineで定義してどのように使うのでしょう?



まさか
#define MAX (2)
#define A[MAX] { 20,30 }
とどこかで定義して

int foo()
{
  int nSum = 0;
  // ここでコンパイルエラー ・・・ 変数名の未定義
  // または nSumが期待した期待ではない物になる ... 50以外
  nSum = A[0] + A[1];
  return nSum;
}
といった使い方なんてしませんよね ・・・

#defineは プリプロセス段階で置換されてしまいますよ
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/11 12:55

 インクルードガード


http://www.google.com/search?hl=ja&q=C+%E3%82%A4 …
 
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/11 12:09

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング