宣言と定義について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
T.C.D

宣言と定義について

#1

投稿記事 by T.C.D » 16年前

宣言と定義の違いを詳しく教えてください。(ヘッダーソースは以前の物と同様)

(ヘッダーファイル)
#ifndef _MYGAME_
#define _MYGAME_

#define s_size 50
#define rank_max 10

	//ゲームシステム関係の変数(構造体)
	//ソースはva.[変数]の形で使用
	struct variable{
		short score,
			  level,
			  rank,
			  tp,
			  over,
			  kazu;
	};
	struct variable g_va = {0, 0, 1, 1};
	
void error(void);
void kaitou(void);
void sistem(struct variable *g_va);


#endif
"定義"というのは、この場合、ヘッダファイルで具体的な数値を
構造体に代入する動作のことなのでしょうか?ー>「struct variable g_va = {0, 0, 1, 1}」の部分

ある解説書では、
下のようにヘッダファイルでグローバル変数(構造体)をヘッダファイルで示し(宣言?)、
2つの .c ソースファイルから
#include "CALORIE.h"で
呼び出しているのですが、

これは"定義"にはならないのでしょうか?

[CALORIE.h]
--略---
typedef struct _CALORIE {
     char name[40];
     float value;
} CALORIE;

-------

zwi

Re:宣言と定義について

#2

投稿記事 by zwi » 16年前

>struct variable g_va = {0, 0, 1, 1}」
はデータ実体を定義しています。

>typedef struct _CALORIE {
>char name[40];
>float value;
>} CALORIE;
は、CALORIEの構造を宣言しています。
値も領域も持っていませんのでデータ実体はありません。

問題なのはデータの実体があるかデータの型や構造宣言だけなのかって事になります。
前回の問題は、ヘッダにデータ実体があったためインクルードしている全部のソースに同じデータ実体が定義さててしまいコンパイラが出力する複数のオブジェクトファイルに同じ名前g_vaのデータを持ってしまいました。
exeファイルを作るリンカは、オブジェクトファイルを読み込んでリンク時に名前参照を解決しますので同じ名前のデータ実体が複数あると何を選んでよいのか分からないのでエラーにするしかないのです。

T.C.D

Re:宣言と定義について

#3

投稿記事 by T.C.D » 16年前

ありがとうございました。

ということは、
< struct variable g_va = {0, 0, 1, 1} >
を1つのソースファイルに移し、
2つのソースから自分が作ったヘッダーを
インクルードすれば問題ないという事ですね。

zwi

Re:宣言と定義について

#4

投稿記事 by zwi » 16年前

はい。そうですね。
ヘッダにstruct variableの構造体宣言だけあれば問題ないです。

閉鎖

“C言語何でも質問掲示板” へ戻る