複数のファイルに跨った構造体の扱いについて質問があります。
下記のソース(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)