ヘッダに宣言した構造体のサイズが参照できない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wasawasa
記事: 94
登録日時: 10年前

ヘッダに宣言した構造体のサイズが参照できない

#1

投稿記事 by wasawasa » 9年前

こんにちは、前々からお世話になっています。
複数のファイルに跨った構造体の扱いについて質問があります。
下記のソース(1)のように構造体TBBTNDEFの宣言とその構造体変数配列TBBTNDT[]の定義をした後にsizeof(TBBTNDT)/sizeof(TBBTNDEF)によって構造体変数配列の配列長を求める記述を作った場合には上手くいったのですが、ソース(2)~(4)のように構造体変数配列TBBTNDT[]の定義を別ファイルで、構造体TBBTNDEFと構造体変数配列TBBTNDT[]の宣言をヘッダで行ってからsizeof(TBBTNDT)/sizeof(TBBTNDEF)によって構造体変数配列の配列長を求めようとした場合は「main.cpp(9) : error C2070: 'TBBTNDEF []': sizeof オペランドが正しくありません。」というエラーが発生してしまいます。
このエラーについて調べたところ、sizeofに式や型以外の物を指定すると発生するエラーらしいという事は分かりましたが、何故ファイルを分けるとTBBTNDEFが型として定義されなくなるのかが分かりません。
また、構造体変数配列TBBTNDTを丸々削ったソース(5)~(6)を走らせるとTBBTNDEFに手を加えたわけでもないのにエラーが起こらなくなるのも納得がいきません。
一体このエラーは何が起こっているのでしょうか?
どなたかよろしくお願いします。

ソース(1)

コード:

//main.cpp
#include <windows.h>
#include <commctrl.h>
//#include "sub.h"

struct TBBTNDEF{
	TBBUTTON ButtonData;
	int MYorNO;//画像自作判定
};
//ボタンデータ:{TBBUTTON},(標準画像かどうかTRUEor画像ID)
TBBTNDEF TBBTNDT[] = {
	{{ STD_FILENEW , 1 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ STD_FILEOPEN , 2 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ STD_FILESAVE , 3 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ 0 , 0 , TBSTATE_ENABLED , TBSTYLE_SEP , 0 , 0 , 0 } ,TRUE},
	{{ STD_COPY , 4 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ STD_CUT , 5 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ STD_DELETE , 6 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 },TRUE}
};

int main(void)
{
	int a;
	a=sizeof(TBBTNDT)/sizeof(TBBTNDEF);
	return 0;
}

-----------------------------------------------------------------------------------------------------------------------------------
ソース(2)

コード:

 
//main.cpp
#include <windows.h>
#include <commctrl.h>
#include "sub.h"

int main(void)
{
	int a;
	a=sizeof(TBBTNDT)/sizeof(TBBTNDEF);
	return 0;
}

ソース(3)

コード:

 
//sub.cpp
#include <windows.h>
#include <commctrl.h>
#include "sub.h"

TBBTNDEF TBBTNDT[] = {
	{{ STD_FILENEW , 1 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ STD_FILEOPEN , 2 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ STD_FILESAVE , 3 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ 0 , 0 , TBSTATE_ENABLED , TBSTYLE_SEP , 0 , 0 , 0 } ,TRUE},
	{{ STD_COPY , 4 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ STD_CUT , 5 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 } ,TRUE},
	{{ STD_DELETE , 6 , TBSTATE_ENABLED , TBSTYLE_BUTTON , 0 , 0 , 0 },TRUE}
};

ソース(4)

コード:

 
//sub.h
#ifndef DEF_SUB_H //二重include防止
#define DEF_SUB_H

struct TBBTNDEF{
	TBBUTTON ButtonData;
	int MYorNO;
};
extern TBBTNDEF TBBTNDT[];

#endif

--------------------------------------------------------------------------------------------------------------------------------------------------
ソース(5)

コード:

 
//main.cpp
#include <windows.h>
#include <commctrl.h>
#include "sub.h"

int main(void)
{
	int a;
	a=sizeof(TBBTNDEF);
	return 0;
}

ソース(6)

コード:

 
//sub.h
#ifndef DEF_SUB_H //二重include防止
#define DEF_SUB_H

struct TBBTNDEF{
	TBBUTTON ButtonData;
	int MYorNO;
};

#endif

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ヘッダに宣言した構造体のサイズが参照できない

#2

投稿記事 by h2so5 » 9年前

sub.h上では配列のサイズが不明なのでサイズを得ることはできません。

wasawasa
記事: 94
登録日時: 10年前

Re: ヘッダに宣言した構造体のサイズが参照できない

#3

投稿記事 by wasawasa » 9年前

>>h2so5さん
返信ありがとうございます。
先に宣言をしておけばsub.cppで定義した内容を拾ってくれるものだと思っていました。
配列の定義をするファイル内に配列のサイズを返す関数を作って対応しようと思います。

閉鎖

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