如果bool是int的宏,为什么它的大小不同?

Nic*_*ckO 6 c memory int boolean

我希望有人可以解释原因

#include <stdbool.h>

printf("size of bool %d\n", sizeof(bool));
printf("size of int %d\n", sizeof(int));
Run Code Online (Sandbox Code Playgroud)

输出到

size of bool 1
size of int 4
Run Code Online (Sandbox Code Playgroud)

我已经看了http://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html这似乎表明,布尔本质上是_Bool宏,当设置为true或false,其实只是一个整数常量的宏.如果是整数,为什么它的大小不一样?

我问,因为我们花了太长时间来调试我们没有分配足够内存的程序.

wkl*_*wkl 12

_BoolC99中的类型(typedef'ed to boolin stdbool.h)没有标准的定义尺寸,但根据C99标准的6.2.5节:

2 An object declared as type _Bool is large enough to store the values 0 and 1.
Run Code Online (Sandbox Code Playgroud)

在C中,最小的可寻址对象(除了位域)是char至少8位宽,并且sizeof(char)总是如此1.

_Boolbool因此有sizeof至少1,在我见过的大多数实现,sizeof(bool)/ sizeof(_Bool)1.

如果你看看GCC stdbool.h,你会得到这个:

 #define bool    _Bool
 #if __STDC_VERSION__ < 199901L && __GNUC__ < 3
 typedef int _Bool;
 #endif

 #define false   0
 #define true    1
Run Code Online (Sandbox Code Playgroud)

因此,如果在编译时使用旧版本的GCC和旧版本的C标准,则将int用作_Bool类型.

当然,作为一个有趣的事情,请检查出来:

#include <stdio.h>
#include <stdbool.h>

int main() {
   printf("%zu\n", sizeof(_Bool));
   printf("%zu\n", sizeof(true));
   printf("%zu\n", sizeof(false));

}
Run Code Online (Sandbox Code Playgroud)

输出:

? > ./a.out 
1
4
4
Run Code Online (Sandbox Code Playgroud)

GCC 4.2.4,Clang 3.0和GCC 4.7.0都输出相同.正如trinithis指出的那样,sizeof(true)并且sizeof(false)产生更大的尺寸,因为它们正在采用int字面的大小,这至少是这样sizeof(int).