5

我们可以在宏中使用sizeof运算符吗?#if如果是,如何?如果不是,为什么?

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

4

4 回答 4

7

不; 该sizeof()运算符不适用于 C 预处理器条件指令,例如#ifand #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)在所有可能的情况下都会被评估,并且括号使表达式无效,即使在预处理器算术的自由规则下也是如此。)

于 2013-06-18T18:56:45.237 回答
6

sizeof()运算符不能在#if和 #elif行中使用,因为预处理器不解析类型名称。

但是#define中的表达式不被预处理器计算;因此它在#d​​efine情况下是合法的。

于 2013-06-18T18:56:47.280 回答
4
#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;
}
于 2013-06-18T19:34:34.980 回答
0

sizeof 在 # 指令中不起作用。在预处理期间尚未定义这些运算符。这就是编译代码的全部意义所在。为了在预处理期间识别 sizeof,您需要在编译器之前使用另一个编译器。

于 2013-06-18T19:01:02.847 回答