Ubuntu (i686) で gcc バージョン 4.3.3 を使用しています。私の理解不足と問題を説明するために、簡略化したテスト プログラムを作成しました。プログラムは、私が実装した構造体のサイズを教えてくれます。だから私は Message のtypedef構造体とちょっと遊んでみる main を持っています:
#include <stdio.h>
typedef struct {
int size;
enum {token=0x123456};
} Message;
int main(int argc, char * argv[])
{
Message m;
m.size = 30;
printf("sizeof(int): %d\n",sizeof(int));
printf("sizeof(0x123456): %d\n",sizeof(0x123456));
printf("sizeof(Message): %d\n",sizeof(Message));
printf("sizeof(m): %d\n",sizeof(m));
}
このソースを gcc でコンパイルすると、次の警告が表示されますが、これは理解できません。
$ gcc sizeof.c
sizeof.c:5: warning: declaration does not declare anything
行 5 は列挙行を参照します。作成したすべてのMessageにそのトークンが必要です。私は何を間違っていますか?その警告を取り除くために何を変更する必要がありますか?
私のメインにはsizeof()の呼び出しがいくつか含まれています。プログラムを実行すると、整数のサイズが 4、16 進数のサイズが 4 であることが出力でわかりますが、typedef 構造体メッセージのサイズも 4 です。
$ ./a.out
sizeof(int): 4
sizeof(0x123456): 4
sizeof(Message): 4
sizeof(m): 4
それは私を非常に混乱させます。Messageのサイズが 4 であるのに、それぞれのサイズが 4 の整数と整数が列挙型内に含まれているのはなぜですか。
しかし、なぜ4つだけなのですか?メッセージの実際のサイズをバイト単位で取得するにはどうすればよいですか? それとも、これが本当のサイズですか?もしそうなら、なぜですか?
CとC++の間でメッセージのサイズを取得することに違いはありますか?