在 C 中使用 #if 进行转换

Casting with #if in C

为什么这段代码报错:

#include <stdio.h>
#define Rep (int)6
int main(){
     #if Rep==6
         printf("T");
     #else
         printf("F");

     #endif

return 0;
}
  1. 为什么拒绝选角?
  2. 是'preprocessor error'还是'compiler error'?

这是一个预处理器错误。发生这种情况是因为预处理器不了解如何转换变量。您不能将任何 C 代码与 #if 一起使用,只能使用简单的数字或扩展为数字的宏。

如果您无法修改 Rep,您可以使用辅助宏来解决此问题,它会从开头删除强制转换:

#include <stdio.h>

#define X(x)
#define Y(x) X x
#define Rep (int)6

int main(void) {
#if Y(Rep) == 6
    printf("%d\n", Y(Rep)); // prints 6
#endif
    return 0;
}

结合转换并且仍然应该在 #if 中工作的预处理器宏很容易编写:您只需在数字前添加一点 +。你的情况

#define Rep ((int)+6)

预处理器用 0 替换它不知道的标识符,因此最终结果是相同的值。

而且,Rep 宏中的强制转换本身也没什么用。 6 是一个 int,无论如何。因此,最好避免对所有具有自己文字的整数类型进行强制转换,UL 的组合在大多数情况下应该作为后缀。