所以我试图在我的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之前的预期表达式”
答案 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 )