我们可以在宏中使用sizeof
运算符吗?#if
如果是,如何?如果不是,为什么?
运算符是否sizeof
在预处理器#if
指令中工作?
不; 该sizeof()
运算符不适用于 C 预处理器条件指令,例如#if
and #elif
。
原因是 C 预处理器不知道类型的大小。
当然,您可以sizeof()
在 'd 宏的主体中使用#define
,因为编译器处理替换文本的分析,而预处理器不处理。例如,经典宏给出数组中元素的数量;它有各种名称,但是是:
#define DIM(x) (sizeof(x)/sizeof(*(x)))
这可以用于:
static const char *list[] =
{
"...", ...
};
size_t size_list = DIM(list);
你不能做的是:
#if sizeof(long) > sizeof(int) // Invalid, non-working code
...
#endif
(问题是条件#if 0(0) > 0(0)
在所有可能的情况下都会被评估,并且括号使表达式无效,即使在预处理器算术的自由规则下也是如此。)
sizeof()运算符不能在#if和 #elif行中使用,因为预处理器不解析类型名称。
但是#define中的表达式不被预处理器计算;因此它在#define情况下是合法的。
#include <stdio.h>
#include <limits.h>
//#if sizeof(int) == 4
#if UINT_MAX == 0xffffffffU
typedef int int32;
#endif
//#if sizeof(long) > sizeof(int)
#if ULONG_MAX > UINT_MAX
typedef long int64;
#elif ULLONG_MAX > ULONG_MAX
typedef long long int64;
#endif
int main(void) {
int64 i64;
int32 i32;
printf("%u, %u\n", (unsigned)sizeof(i64), (unsigned)sizeof(i32));
return 0;
}
sizeof 在 # 指令中不起作用。在预处理期间尚未定义这些运算符。这就是编译代码的全部意义所在。为了在预处理期间识别 sizeof,您需要在编译器之前使用另一个编译器。