
配列の大域変数externの使いかたがよくわかりません。
BCC Developerを用いて分割コンパイルをしています。
headerファイルにて配列
int map[10][10];
と定義してその配列を他のファイルで使いたい場合は
extern int map;
ではいけないのでしょうか?
あと、headerにて
static int * map[10][10]
と記述して他のファイルにて
extern int *map
という記述の仕方は可能なのでしょうか?
大域変数なのにstaticを用いるのはおかしいかとおもいますが…
ご教授よろしくお願いします。
No.1ベストアンサー
- 回答日時:
「header ファイル」ってなんだ, とか「それがいわゆるヘッダファイルのことならそこで定義するのは絶対にやめろ」とかなるわけだが, それをおいてもと~ぜんダメです.
int map[10][10];
と定義するなら extern 宣言するときも
extern int map[10][10];
でなければなりません... と, 一応言っておこう.
言語仕様上は
extern int map[][10];
でもいい (けどこの場合上と違って sizeof が使えないことに注意).
あと
int array[10];
に対して
extern int array[10];
や
extern int array[];
は OK だが
extern int *array;
は NG だ.
No.3
- 回答日時:
余分な知識の補足
同じ宣言を2つのファイルで宣言するのは面倒です。
また、実体(externなし)を変更したら参照(extern)も変更しなくてはならないため、ヘッダファイルに宣言しても良いのでは無いかと考えます。
(ヘッダファイルに変数宣言するのを悪と考える場合もありますが、名前が競合しないよう管理されていれば問題なしと判断しています)
そこで、発生する疑問が「ヘッダファイルにしてインクルード先によってexernあり・なしを切り替えるためにはどうしたら良いか?」です。
それを解決するのが以下の方法です。
●ヘッダファイルの宣言
-<smpinc.h>-------------------------
#ifndef __SMPINC_H__
#define __SMPINC_H__
#ifdefMYEXTERN
#definemyextern extern
#else
#definemyextern
#endif
myextern int hoge[2][10];
myextern char acHoge[256];
#endif
●大域変数の実体を生成する場合
-<implsmp.c>----------------------------
#define MYEXTERN // makefileなどにコンパイルオプションとして記載してもOK
#include<smpinc.h>
void aho()
{
hoge[1][2]=10;
}
●大域変数のを参照する場合
--<externsmp.c>--------------------------
#include<smpinc.h>
void aho()
{
hoge[1][2]=20;
}
----------------------------------------
No.2
- 回答日時:
int*とint[10][10]が、別の型と解釈されるのは、No.1の人の言うとおりですが、他に気になった点を。
関数の外で定義される変数は、問答無用でstatic変数ですが、明示的にstaticを指示すると、スコープルール的には、他のコンパイル単位=モジュール=ソースファイルからは見えなくなります。いわゆる他の言語で言うprivate変数となります。
他に見せたいのなら、staticを付けてはいけません。
また、特別な事情がなければ、一般的にはヘッダファイルには、変数自体を定義してはいけません。
ヘッダは、複数のファイルがインクルードするので、変数の定義をすると、変数定義が重複することになるからです。それは、変数に限らず、関数も同様で、ヘッダに関数のプロトタイプ宣言はよく見るけど、定義(=本体が書いてある状態)は、あまり見たことがないでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
外部シンボル "_main"は未解決です
-
” OS ビルド ” の意味が分か...
-
エクセルVBAではRound...
-
「fatal error C1189」を回避す...
-
セミコロンについて
-
<math.h>があるのにsqrtが・...
-
Makefile作成時の拡張子.oとは?
-
ILSpyで、デコンパイルできない。
-
VBAを何回も作り直して、容量が...
-
C言語でmからnまでの合計を求め...
-
クリティカルエラー Expressio...
-
USBカメラライブラリー ECWLIB...
-
TeXエディタの選定
-
visual fortranのコンパイル時...
-
C言語でヘッダファイルにグロー...
-
複数ファイルから同じ関数の呼...
-
マクロ コンパイルがグレーバック
-
PRO*C コンパイルエラー
-
MO, PO, POT, ファイルの開き方...
-
【VC++6.0(MFC)】警告「LINK : ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
C言語でヘッダファイルにグロー...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
Makefile作成時の拡張子.oとは?
-
外部シンボル "_main"は未解決です
-
<math.h>があるのにsqrtが・...
-
ILSpyで、デコンパイルできない。
-
クリティカルエラー Expressio...
-
【VC++6.0(MFC)】警告「LINK : ...
-
マクロ コンパイルがグレーバック
-
セミコロンについて
-
複数のサブディレクトリを一緒...
-
C言語のコンパイルができません
-
PRO*C コンパイルエラー
-
ExcelVBAで『ByRef 引数の型が...
-
コンパイルエラー:ユーザ定義...
-
プリコンパイルエラーについて
おすすめ情報