在 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;
}
- 为什么拒绝选角?
- 是'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
,无论如何。因此,最好避免对所有具有自己文字的整数类型进行强制转换,U
和 L
的组合在大多数情况下应该作为后缀。
为什么这段代码报错:
#include <stdio.h>
#define Rep (int)6
int main(){
#if Rep==6
printf("T");
#else
printf("F");
#endif
return 0;
}
- 为什么拒绝选角?
- 是'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
,无论如何。因此,最好避免对所有具有自己文字的整数类型进行强制转换,U
和 L
的组合在大多数情况下应该作为后缀。