#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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
#defineの定数を文字列として読み込む
C言語・C++・C#
-
defineを使った配列
C言語・C++・C#
-
関数から配列を返すには?
C言語・C++・C#
-
-
4
構造体のメンバをfor文で回したい
C言語・C++・C#
-
5
printf で二進表示を行いたい。
C言語・C++・C#
-
6
C言語 配列の長さの上限
C言語・C++・C#
-
7
C言語での引数の省略方法
C言語・C++・C#
-
8
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
9
【#define】 defineで定義した値を配列のサイズに使う事は可能?
C言語・C++・C#
-
10
配列をnビットシフトする
C言語・C++・C#
-
11
fopne で失敗する原因
C言語・C++・C#
-
12
char*を初期化したいのですが
C言語・C++・C#
-
13
C言語のポインターに関する警告
C言語・C++・C#
-
14
「#undef」と「#define」の使い方について
C言語・C++・C#
-
15
C言語 exitの使い方
C言語・C++・C#
-
16
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
17
typedef enumの使い方を教えてください
C言語・C++・C#
-
18
文字列の切り出し
C言語・C++・C#
-
19
#define 文
C言語・C++・C#
-
20
【gcc・cygwin】multiple definitionエラーの解決法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語 構造体
-
MFCのCArrayを使った二次元配列
-
C言語において、 配列要素をひ...
-
構造体のextern方法
-
define で 配列
-
[C++]const int と配列
-
小数点第200位近くまでの商...
-
C言語の2次元配列 容量が大き...
-
char型配列をint型に代入するには
-
C言語の配列のコピーについて
-
C#で構造体の配列を持った構造...
-
3次元配列の動的確保
-
C言語について質問です。
-
C言語の平均点の出し方
-
fclose()でセグメンテーション違反
-
ファイルのデータを構造体に代...
-
2番目の最大値を求める
-
C#で配列が空かを判定するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報