C/C++:包含 int 和枚举的 typedef 结构的大小 == sizeof(int)
C/C++: size of a typedef struct containing an int and enum == sizeof(int)?
我在我的 Ubuntu (i686) 上使用 gcc 版本 4.3.3。我写了一个精简的测试程序来描述我缺乏理解和我的问题。程序将告诉我我实现的结构的大小。所以我有一个用于消息的 typedef 结构和一个小主玩:
#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): %dn",sizeof(int));
printf("sizeof(0x123456): %dn",sizeof(0x123456));
printf("sizeof(Message): %dn",sizeof(Message));
printf("sizeof(m): %dn",sizeof(m));
}
在使用gcc编译此源代码时,我收到以下警告,我不明白:
$ gcc sizeof.c
sizeof.c:5: warning: declaration does not declare anything
第 5 行是指枚举行。我希望在我创建的每条消息中都有那个令牌。我做错了什么?我必须更改什么才能摆脱该警告?
我的 main 包含几个 sizeof() 的调用。当我运行程序时,您可以在输出中看到整数的大小为 4,十六进制数的大小为 4,但 typedef 结构 Message 的大小也为 4:
$ ./a.out
sizeof(int): 4
sizeof(0x123456): 4
sizeof(Message): 4
sizeof(m): 4
这让我非常困惑。为什么消息的大小为 4,尽管它在枚举中包含一个整数和一个整数,每个大小为 4。如果 sizeof(消息) 至少为 8,这对我来说是合乎逻辑的。
但为什么只有4个呢?如何获取消息的实际大小(以字节为单位)?或者这真的是真正的尺寸?如果是这样,为什么?
获取 C 和 C++ 之间的消息大小是否有区别?
枚举实际上不需要任何空格,它只是编译器通过名称识别一组文字数字的一种方式。
您没有声明任何内容:
enum {token=0x123456};
您的声明类似于:
typedef struct {
int size;
int;
} Message;
如果像这样声明结构:
typedef struct {
int size;
enum {token=0x123456} e;
} Message;
将有两个字段,但e
不会初始化为任何内容。您需要为每个实例手动设置它:message.e=token
。
实现你想要的正确方法是,在C++中使用构造函数:
struct Message {
int size;
int token;
Message() : token(0x123456) {};
};
或 C++11 中的非静态数据成员初始值设定项:
struct Message {
int size;
int token=0x123456;
};
在 C 语言中无法初始化结构声明中的字段。
第 5 行不声明任何枚举类型的变量。因此,编译器做了它唯一能做的事情:忽略它。
如果要在结构中创建该类型的成员,请编写类似
enum {token=0x123456} thetoken;
但请注意,此字段只能有一个有效值,这是您想要的吗?
编辑:
哦,回答你的另一个问题:编译为 C 或 C++ 时,我看不到输出的差异。但是,编写结构定义的方式是有区别的。
typedef struct {
int size;
enum YouShouldDeclareAName {token=0x123456};
} Message;
您的枚举是消息结构的子类/子类型,因此绑定到类而不是对象。就像命名空间一样。您不会使用它创建任何变量。将其更改为:
typedef struct {
int size;
enum YouShouldDeclareAName {token=0x123456} token;
//or
YouShouldDeclareAName token2;
} Message;
您已经定义了一个在所有对象之间共享的常量Message::token
。由于它是共享的,因此不计入单个对象的大小。
正如其他人回答所指出的,您已经声明了一个枚举类型,您只是碰巧在结构内而不是在全局范围内执行此操作。 没有要存储的内容,因此它不使用内存。
现在,如果您要在该结构中声明枚举的实例...
typedef struct {
int size;
enum {token=0x123456} e;
} Message;
int main(int argc, char * argv[])
{
Message m;
m.size = 30;
printf("sizeof(m): %dn",sizeof(m));
}
sizeof(m): 8
Press any key to continue . . .
5 行:
enum {token=0x123456};
这一行没有定义任何enum
变量,它是一个声明,因此你的编译器抱怨第 5 行说它只是一个声明。
正确的用法应该是:
enum {xyz=5} enum_variable_name;
只有这样,编译器才会为此分配空间。
就像类、函数、枚举一样,静态 menber 不存储在对象空间中!
- sizeof(size_t) 可以小于 sizeof(int) 吗?
- 在 <char>sizeof(int) == 1 的平台中如何编码 char_traits::eof() ?
- 如何理解"vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) )"?
- sizeof(int(123)) 是什么意思?
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- x = malloc(n * sizeof (int));无法将 void 转换为 int
- 如何解释sizeof(std::vector<int>)的值?
- 为什么sizeof int是错误的,而sizeof(int)是正确的
- "new int[5]"和"malloc(5 * sizeof(int))"之间的C++有什么区别?
- C/C++:在32位机器上的sizeof(short)、sizeof(int)、sizeof(long)、size of
- C/C++:包含 int 和枚举的 typedef 结构的大小 == sizeof(int)
- 为什么 sizeof(int) 与 sizeof(int*) 不同
- 如何理解"C++ allows sizeof(char*) != sizeof(int*)"?
- 在这种情况下,sizeof(int) 返回什么
- 在32位或64位平台上,sizeof(int)=1
- sizeof类,在C++中有int,function,virtual函数
- 将-1移位到sizeof(int)在C++中生成两个不同的结果
- sizeof(int)是否始终等于sizeof(void*)
- 为什么C#中的sizeof(int*)=8,C++中的sizeof[int*]=4
- 当sizeof(int)=sizeof(long)时,long优于int的任何情况