重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

学習のため勉強していますが
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件)

「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];
と解釈され「変数の外部参照宣言」となります。
    • good
    • 0

本題とは別の話で、ヘッダーファイルには関数の実体を書かないのが一般的です。

    • good
    • 0
この回答へのお礼

ありがとうございました。
確かにtest3.hとtest3.c、test4.hとtest4.cを間違えていました。
済みませんでした。

お礼日時:2009/08/03 00:07

変数g_arrayを定義する必要があります。



externっていうのは「別の(オブジェクト)ファイルでもこの型でこの名前の変数(シンボル)を使います」という宣言で、定義ではありません。
リンクされるファイルのどこかで定義されている必要があります。

また、#include は他のファイルをその場所にそのまんま入れるということを行うだけなので、#include されたものは別のオブジェクトファイルではありません。

・・・という以上が理屈です。端的に解決方法を述べれば、test3かtest4かどちらかに変数g_arrayの定義を入れてやればOKのはずです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!