为什么sizeof run on struct必须有括号

时间:2014-11-02 16:29:13

标签: c struct

所以我试图在我的C程序中获得结构的大小并编写以下代码:

typedef struct Msg_Header Msg_Header; // the struct Msg_Header was defined earlier

int size = sizeof Msg_Header;

这产生了一个我无法理解的编译错误。为了使其工作,我发现我必须使用这样的括号:

int size = sizeof(Msg_Header);

这很奇怪,因为sizeof完全适用于简单的变量类型,比如没有括号的int,当我使用struct Msg_Header而不是别名时,同样奇怪的行为会产生影响。

有人能解释一下这里发生了什么吗?

编辑: 编译错误说:“在Msg_Header之前的预期表达式”

2 个答案:

答案 0 :(得分:1)

sizeof运算符只能在表达式的情况下使用而不能使用parantheses,而不是类型(也不是由typedef keyword创建的类型同义词)本身。有关可能的有效用法,请参阅以下示例:

#include <stdio.h>

struct Msg_Header { // struct tag
    int n;
};

typedef struct Msg_Header Msg_Header; // typedef synonym

int main(void) {
    Msg_Header msg_header;

    printf("%zu\n", sizeof(struct Msg_Header));
    printf("%zu\n", sizeof(Msg_Header));
    printf("%zu\n", sizeof msg_header);

    return 0;
}

此处的生活示例:http://ideone.com/tMB5cY

答案 1 :(得分:1)

虽然sizeof是操作符而不是函数,但是当与类型一起使用时,您需要使用括号。基本上你把它当作类型的类型转换,需要括号。

来自标准6.5.3 Unary operators

unary-expression:
    postfix-expression
    ++ unary-expression
    -- unary-expression
    unary-operator cast-expression
    sizeof unary-expression
    sizeof ( type-name )