sizeof运算符是否在预处理器#if指令中工作?

时间:2013-06-18 18:52:24

标签: c sizeof

我们可以在sizeof宏中使用#if运算符吗?如果有,怎么样?如果没有,为什么?

sizeof运算符是否适用于预处理程序#if指令?

4 个答案:

答案 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,在编译器之前需要另一个编译器。