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

Var*_*ani 4 c sizeof

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

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

Jon*_*ler 6

没有; 该sizeof()运营商并不在C预处理条件指令工作,如#if和#elif.

原因是C预处理器不知道类型的大小.

当然,您可以sizeof()在#define'd宏的主体中使用,因为编译器处理替换文本的分析而预处理器不处理.例如,经典宏给出了数组中元素的数量; 它有各种各样的名字,但是:

#define DIM(x) (sizeof(x)/sizeof(*(x)))
Run Code Online (Sandbox Code Playgroud)

这可以用于:

static const char *list[] =
{
    "...", ...
};
size_t size_list = DIM(list);
Run Code Online (Sandbox Code Playgroud)

你不能做的是:

#if sizeof(long) > sizeof(int)  // Invalid, non-working code
...
#endif
Run Code Online (Sandbox Code Playgroud)

(问题是#if 0(0) > 0(0)在所有合理的情况下评估条件,并且括号使表达式无效,即使在预处理器算术的自由规则下也是如此.)

  • 当你完全理解这一切时,你就会知道为什么编译以下三行代码会产生警告:(1)`#if sizeof +8> sizeof + 4LL`(2)`#warning sizeof int 8 large than大长4`(3)`#endif`的大小. (4认同)
  • @VarunChhangani:当然可以.宏将扩展为包含`sizeof`关键字的内容,并且将正常评估生成的表达式. (2认同)
  • @VarunChhangani:这是因为编译器分阶段工作的方式,预处理在源被解析为令牌之前完成,令牌被识别为类型或关键字(等).逻辑上,C预处理器在编译器正确看到任何内容之前完整地运行.预处理器完全忽略C关键字; 你可以使用`#define const/*nothing*/`并且预处理器很高兴并且有效地擦除源中出现的任何`const`.您可以拥有一个与C关键字同名的宏; 预处理器可以正常(但没有其他人). (2认同)

Sha*_*ain 6

甲的sizeof()操作者不能在使用#if和#elif指令线,因为预处理器不分析类型的名称.

但#define中的表达式不由预处理器评估; 因此在#define案例中它是合法的.


BLU*_*IXY 5

#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;
}
Run Code Online (Sandbox Code Playgroud)