C / C ++:包含int和enum == sizeof(int)的typedef结构的大小?

时间:2012-06-14 12:04:08

标签: c++ c struct size enumeration

我在我的Ubuntu(i686)上使用gcc 4.3.3版。我写了一个精简测试程序来描述我缺乏理解和我的问题。程序应该告诉我我实现的结构的大小。所以我有一个 typedef struct 用于消息,还有一个主要的用途:

#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行是指枚举行。我想在我创建的每个消息中使用该令牌。我究竟做错了什么?为了摆脱这种警告,我需要改变什么?

我的主要包含几个 sizeof()的调用。当我运行程序时,你可以在输出中看到整数的大小为4,十六进制数的大小为4,但typedef struct Message的大小也是4:

$ ./a.out
sizeof(int): 4
sizeof(0x123456): 4
sizeof(Message): 4
sizeof(m): 4

这对我来说非常困惑。为什么消息的大小为4,尽管它包含整数和枚举中的整数,每个大小为4.如果 sizeof(消息)将位于至少8,这对我来说是合乎逻辑的。

但为什么只有4?如何获取消息的字节的实际大小?或者这真的是真正的大小?如果是这样,为什么?

在C和C ++之间获取消息的大小有什么不同吗?

8 个答案:

答案 0 :(得分:10)

枚举实际上并不需要任何空间,它只是编译器通过名称识别一组文字数字的一种方式。

答案 1 :(得分:3)

第5行没有声明任何类型为enum的变量。所以编译器只做它能做的事情:忽略它。

如果要在结构中创建该类型的成员,请编写类似

的内容
enum  {token=0x123456} thetoken;

但请注意,此字段只能有一个有效值,是您想要的吗?

修改
哦,回答你的另一个问题:在编译为C或C ++时,我看不出输出的差异。但是如何编写结构定义之间存在差异。

答案 2 :(得分:3)

typedef struct {
    int size; 
    enum YouShouldDeclareAName {token=0x123456}; 
} Message;

你的枚举是你的Message结构的子类/子类型,因此绑定到Class而不是object。像命名空间一样。你不用它创建任何变量。 将其更改为:

typedef struct {
    int size; 
    enum YouShouldDeclareAName {token=0x123456} token; 

    //or
    YouShouldDeclareAName token2;
} Message;

答案 3 :(得分:3)

你没有宣布任何事情:

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语言中初始化struct声明中的字段。

答案 4 :(得分:2)

您已经定义了一个在所有对象之间共享的常量Message::token。由于它是共享的,因此不会计入单个对象的大小。

答案 5 :(得分:2)

正如其他人的答案所说,你已经声明了一个枚举的类型,你恰好在一个结构内而不是在全局范围内。没有什么可以存储,因此它不使用任何内存。

现在,如果您要在该结构中声明枚举的实例......

typedef struct {
    int size; 
    enum {token=0x123456} e; 
} Message;

int main(int argc, char * argv[])
{
    Message m;
    m.size = 30;
    printf("sizeof(m): %d\n",sizeof(m));
}

sizeof(m): 8
Press any key to continue . . .

答案 6 :(得分:1)

第5行:

enum {token=0x123456};

这一行没有定义任何enum变量,它是一个声明,因此你的编译器抱怨第5行说它只是一个声明。

正确使用应该是:

enum {xyz=5}  enum_variable_name;

只有这样,编译器才会为此分配空间。

答案 7 :(得分:0)

就像class,function,enum,static menber不存储在对象空间中一样!