我们可以在sizeof
宏中使用#if
运算符吗?如果有,怎么样?如果没有,为什么?
sizeof
运算符是否适用于预处理程序#if
指令?
答案 0 :(得分:6)
没有; sizeof()
运算符不适用于C预处理程序条件指令,例如#if
和#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)
,并且括号使表达式无效,即使在预处理器算术的自由规则下也是如此。)
答案 1 :(得分:6)
sizeof()运算符不能用于 #if和#elif 行,因为预处理器不会解析类型名称。
但预处理器不评估 #define 中的表达式;因此在 #define 案例中是合法的。
答案 2 :(得分:3)
#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;
}
答案 3 :(得分:0)
sizeof在#指令中不起作用。在预处理期间尚未定义这些运算符。这就是编译代码的重点。要在预处理期间识别sizeof,在编译器之前需要另一个编译器。