【发布时间】:2013-05-30 09:46:00
【问题描述】:
在回答有关 sizeof() 的问题时,为了了解 GCC 的处理方式,我编写了以下代码:
#include<stdio.h>
#include<stddef.h>
#include<limits.h>
int main(int ac, char *argv[])
{
printf("%zu\n", sizeof(9999999999999999999999999999999999999999999999999999) );
printf("%zu %zu \n", sizeof(int), sizeof(long long));
return 0;
}
编译时,GCC (4.1.2) 发出警告(如预期):
t.c:8:24: warning: integer constant is too large for its type
t.c: In function main:
t.c:8: warning: integer constant is too large for long type
输出是:
16
4 8
GCC 怎么说 sizeof(9999999999999999999999999999999999999999999999999999) 是 16 ?!不管numnber 有多大,对于任何大于LLONG_MAX 的整数文字,它总是16。在我的 64 位平台上,sizeof(long) 等于 sizeof(long long)。
为什么 GCC 会这样?这是某种未定义的行为吗?!
【问题讨论】:
-
顺便说一下,
sizeof不是一个函数,所以它真的不应该拼写为sizeof(),因为这意味着它是。 -
@unwind:据我所知,你不能拥有
sizeof long long。sizeof(T)很常见也很好。 -
@unwind 我知道 sizeof() 不是函数,而是运算符。但我认为提到 sizeof() 没有任何问题。
-
更不用说没有括号,它是模棱两可的。
sizeof 1 + 1->sizeof(1) + 1或sizeof(1 + 1)? -
这不是实际上模棱两可的:语法说明了如何解析它。不过,这是个坏主意,因为 people 无法直截了当。 :-) [保持直截了当的技巧,顺便说一句:如果它被解析为 (sizeof (1 + 1)),那么 sizeof(1) + 1 仍然是 sizeof expr + expr 仍然是 (sizeof ((1) + 1))。所以它必须意味着 ((sizeof 1) + 1)。]