
学習のため勉強していますが
test3.obj : error LNK2001: 外部シンボル ""int * g_array" (?g_array@@3PAHA)" は未解決です。
となります。リンクエラーだと解りましたが、どこに問題があるのかわかりません。
ソースは以下のとおりです。よろしくお願いします。
【stdafx.h】
#include "targetver.h"
#include <tchar.h>
#ifndef _TEST4_H_
#define _TEST4_H_
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int MAXARRAY = 30;
extern int g_array[MAXARRAY];
void printArray();
#endif
#include "stdafx.h"
【test3.h】
int _tmain(int argc, _TCHAR* argv[])
{
//配列の初期化
srand((unsigned int)time(NULL));
for(int i = 0; i < MAXARRAY; i++)
{
g_array[i] = rand() % 1000;
}
printArray();
return 0;
}
【test4.h】
#include "stdafx.h"
void printArray()
{
for(int y = 0; y < MAXARRAY/10; y++)
{
for(int x = 0; x < 10; x++)
{
int i = y * 10 + x;
printf("%3d ", g_array[i]);
}
printf("\n");
}
}
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
「extern」は「どこか別のオブジェクトに居ます」と言う宣言です。
なので変数は定義されません。なのでtest3もtest4も「g_arrayはどこか別のオブジェクトに居ます」としてコンパイルされ、変数はどこにも定義されません。
従って「外部シンボル ""int * g_array" (?g_array@@3PAHA)" は未解決です」と言う事になります。
同一のヘッダで「変数の実体の定義」と「変数が外部にある宣言」を同時に行う場合は、以下のようにします。
【globalvar.h】
#ifndef _GLOBALVAR_H_
#define _GLOBALVAR_H_
#ifdef ___MAIN___
#ifdef EXTERN
#undef EXTERN
#endif
#define EXTERN
#else
#define EXTERN extern
#endif
const int MAXARRAY = 30;
EXTERN int g_array[MAXARRAY];
#endif
【test3.h】
#include "globalvar.h"
#ifndef _TEST3_H_
#define _TEST3_H_
略
#endif
【test4.h】
#include "globalvar.h"
#ifndef _TEST4_H_
#define _TEST4_H_
略
#endif
【test3.c】
#define ___MAIN___
#include "test3.h"
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
以下略
【test4.c】
#undef ___MAIN___
#include "test4.h"
#include "stdafx.h"
void printArray()
{
以下略
ここで重要なのが「メインでのみ___MAIN___が定義されている」と言うことです。
これによりtest3.cでは
EXTERN int g_array[MAXARRAY];
は
int g_array[MAXARRAY];
と解釈され「変数の定義」となります。また、test4.cでは
EXTERN int g_array[MAXARRAY];
は
extern int g_array[MAXARRAY];
と解釈され「変数の外部参照宣言」となります。
No.2
- 回答日時:
本題とは別の話で、ヘッダーファイルには関数の実体を書かないのが一般的です。
ありがとうございました。
確かにtest3.hとtest3.c、test4.hとtest4.cを間違えていました。
済みませんでした。
No.1
- 回答日時:
変数g_arrayを定義する必要があります。
externっていうのは「別の(オブジェクト)ファイルでもこの型でこの名前の変数(シンボル)を使います」という宣言で、定義ではありません。
リンクされるファイルのどこかで定義されている必要があります。
また、#include は他のファイルをその場所にそのまんま入れるということを行うだけなので、#include されたものは別のオブジェクトファイルではありません。
・・・という以上が理屈です。端的に解決方法を述べれば、test3かtest4かどちらかに変数g_arrayの定義を入れてやればOKのはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構造体を引数とする、クラス間...
-
main.c:7:43: warning: implici...
-
【#define】 defineで定義した...
-
C++/CLIでネイティブの構造体を...
-
2重定義って??
-
構造体の要素すべてに対する四...
-
C++でboolにintの値を代入する...
-
C++のコンストラクタを宣言する...
-
C#でオセロを作っているのです...
-
64bit → 32bit型へのキャスト
-
DWORDの実際の型は何でしょうか
-
C言語のコンパイルエラー
-
相互参照するクラス、俺こんな...
-
24ビットの変数
-
long型の定数の末尾にLを付ける...
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
main.c:7:43: warning: implici...
-
long型の定数の末尾にLを付ける...
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
C++のfor文について
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
intとINTの違いは?
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
プログラムの中で別のmainを呼...
-
エラー「invalid conversion fr...
-
GCCで暗黙の型変換の警告を出し...
-
【#define】 defineで定義した...
-
sshdログの意味
-
DDVによるメッセージの変更
-
typedef enumの使い方を教えて...
-
構造体を生成時にわざわざ初期...
-
DLLでLIBファイルが作成されない
おすすめ情報