
#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(){
....
こんな感じです。
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];
でいかがでしょうか。
ご回答ありがとうございます。
やりたいのは1でした。
まだextern static 等の使いわけが理解できていなかったようです。
これを期にべんきょうしなおします。
有難うございました。
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は プリプロセス段階で置換されてしまいますよ
有難うございます。
ご指摘の通り最初これで失敗しました。
#define の限界に気づきました。
C++ではdefineを使わない方がいいとされてるらしいですが、ここら辺のことも関係して来ているのでしょうか?
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【#define】 defineで定義した値を配列のサイズに使う事は可能?
C言語・C++・C#
-
defineを使った配列
C言語・C++・C#
-
#defineの定数を文字列として読み込む
C言語・C++・C#
-
-
4
C言語での引数の省略方法
C言語・C++・C#
-
5
C言語 配列の長さの上限
C言語・C++・C#
-
6
16進数を10進数に簡単に変換する関数は?
C言語・C++・C#
-
7
#defineが使用するメモリ領域について
C言語・C++・C#
-
8
C言語---ファイルに出力したデータをすべて消去する方法
C言語・C++・C#
-
9
EOF
C言語・C++・C#
-
10
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
11
構造体のメンバをfor文で回したい
C言語・C++・C#
-
12
関数から配列を返すには?
C言語・C++・C#
-
13
C言語のポインタに直接アドレスを割り振りしたい
C言語・C++・C#
-
14
配列をnビットシフトする
C言語・C++・C#
-
15
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
16
複数の変数を宣言する時、同時に初期化?できないでしょうか?
Java
-
17
配列を使わずに、変数名を動的にループで回したい
C言語・C++・C#
-
18
freadでデータがない場合の読込値は?
C言語・C++・C#
-
19
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
20
プログラムについての質問です。 fflush(stdout)はいったいどのような時に使われているので
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
c言語
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
2番目の最大値を求める
-
C#で構造体の配列を持った構造...
-
MFCのCArrayを使った二次元配列
-
ファイルのデータを構造体に代...
-
C#で配列が空かを判定するには?
-
RAW画像高速表示について
-
C言語についてです 5人のテスト...
-
C言語 ファイルの指定された行...
-
define で 配列
-
配列における数値の比較について
-
要素数・要素の値が未定の配列...
-
ループカウンタを使用せず、配...
-
コンボボックスでデフォルト値...
-
引数で指定された配列の要素数...
-
配列のアドレス部
-
C言語 配列の長さの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
c言語
-
C言語 ファイルの指定された行...
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C言語の課題が出たのですが自力...
-
char型配列をint型に代入するには
-
C#で配列が空かを判定するには?
-
MFCのCArrayを使った二次元配列
-
コンボボックスでデフォルト値...
-
MFC - ダイアログボックスのPic...
-
c言語 構造体
-
2番目の最大値を求める
-
C言語から質問です。
-
Cのエラー
-
プログラミングに関する問題が...
-
C言語の2次元配列 容量が大き...
-
Visual C++を 用いたテキストフ...
おすすめ情報