
#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の定数を文字列として読み込む
C言語・C++・C#
-
defineを使った配列
C言語・C++・C#
-
関数から配列を返すには?
C言語・C++・C#
-
-
4
【gcc・cygwin】multiple definitionエラーの解決法
C言語・C++・C#
-
5
【#define】 defineで定義した値を配列のサイズに使う事は可能?
C言語・C++・C#
-
6
C言語での引数の省略方法
C言語・C++・C#
-
7
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
8
C言語 配列の長さの上限
C言語・C++・C#
-
9
C言語のポインタに直接アドレスを割り振りしたい
C言語・C++・C#
-
10
C言語でunsigned char配列を連結する方法ってありますか?
C言語・C++・C#
-
11
switch の範囲指定
C言語・C++・C#
-
12
char*を初期化したいのですが
C言語・C++・C#
-
13
ソース内の行末に\\
C言語・C++・C#
-
14
0xffffとは?
C言語・C++・C#
-
15
C言語のポインターに関する警告
C言語・C++・C#
-
16
エラーの原因は?「この関数の定義が見つかりません」
C言語・C++・C#
-
17
C言語で構造体のメンバを簡単に出力する方法ありますか?
C言語・C++・C#
-
18
プログラムでの数字につく”f”の意味
C言語・C++・C#
-
19
fopenで別ディレクトリにファイルをオープンしたい
C言語・C++・C#
-
20
typedef enumの使い方を教えてください
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構造体のextern方法
-
C++DLLからC#へのコールバック...
-
C言語の配列のコピーについて
-
C言語 数値の連続入力について
-
関数から配列を返すには?
-
ポインタを使って構造体の配列...
-
2番目の最大値を求める
-
define で 配列
-
C#でのフィボナッチ数列
-
C言語について。
-
C言語 配列の長さの上限
-
python の2次元配列のメリット...
-
VBAのプログラムで、DIAG = 1# ...
-
dllを使用しVB側に文字列...
-
new演算子で領域を確保した変数...
-
C#,C++/CLI,MFCにおけるデータ...
-
nullと""、\\0とEOFの違いにつ...
-
char*を初期化したいのですが
-
プログラムによく出てくるst...
-
n個の要素で出来る順列組み合...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
define で 配列
-
C言語において、 配列要素をひ...
-
C#で構造体の配列を持った構造...
-
C言語 ファイルの指定された行...
-
構造体のextern方法
-
配列の要素数に変数を入れたい...
-
コンボボックスでデフォルト値...
-
C言語の2次元配列 容量が大き...
-
C++DLLからC#へのコールバック...
-
Cのエラー
-
c言語プログラミング 等差数列...
-
fclose()でセグメンテーション違反
-
MFC - ダイアログボックスのPic...
-
MFCのCArrayを使った二次元配列
-
C言語 数値の連続入力について
-
C言語の配列のコピーについて
-
ポインタを使って構造体の配列...
-
C#でのフィボナッチ数列
-
C#で配列が空かを判定するには?
おすすめ情報