
学習のため勉強していますが
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 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# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++/CLIでネイティブの構造体を...
-
テンプレート関数でコンパイル...
-
構造体vectorの入れ子のfillの...
-
DDVによるメッセージの変更
-
分割コンパイル時に構造体....
-
C++のコンストラクタを宣言する...
-
voidについて
-
LNK2019: 未解決の外部シンボル...
-
C++builederでのエラー(atoiを...
-
C言語の課題について
-
プログラムを組んだのにエラー...
-
typedef enumの使い方を教えて...
-
512Lや1024L等の「L」について
-
C++でboolにintの値を代入する...
-
構造体のあるメンバを基準にソ...
-
main.c:7:43: warning: implici...
-
C で、a、b、c が16ビット符号...
-
C言語 宣言した変数になにも代...
-
外部シンボル未解決
-
構造体のvectorを引数として関...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
C++でboolにintの値を代入する...
-
2重定義って??
-
main.c:7:43: warning: implici...
-
typedef enumの使い方を教えて...
-
プログラムの中で別のmainを呼...
-
変数の型を定義しなかった場合...
-
関数の実体定義にヘッダファイ...
-
ハンドルされていない例外が発...
-
構造体の要素すべてに対する四...
-
C言語のコンパイルエラー
-
DLLでLIBファイルが作成されない
-
sshdログの意味
-
DLLのLPSTR 項目の戻り値の取得...
-
enumについて
-
VC6でlong longでエラー?
-
【#define】 defineで定義した...
おすすめ情報