与#如果铸造用C
为什么这个代码给出了一个错误:与#如果铸造用C
#include <stdio.h>
#define Rep (int)6
int main(){
#if Rep==6
printf("T");
#else
printf("F");
#endif
return 0;
}
- 为什么会拒绝铸造?
- 它是'预处理器错误'还是'编译器错误'?
这是一个预处理器错误。发生这种情况是因为预处理器不知道如何投射变量。您不能在#if
中使用任何C代码,只能使用简单数字或扩展为数字的宏。
如果您不能修改Rep
,就可以解决这个用辅助宏,从而消除从一开始铸造:结合了石膏,并且还应该#if
工作很容易
#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;
}
这是一个狡猾的小宏。 –
只是'#define Rep((int)+6)'会做。但是等一下,'6'是一个'int',那么为什么要把所有的东西放在一起。 –
@JensGustedt我不认为这很简单,因为它与典型的演员语法不同。这意味着你必须修改常量来添加黑客。如果你可以修改这个常量,那么更好的想法是不要删除没有效果的演员阵容? –
Preprossor宏写:你只需在号码前加点+
。在你的情况
#define Rep ((int)+6)
预处理替换它不0
知道,所以最终的结果是相同的值标识符。
但是,在你的Rep
宏中投的本身是无用的。无论如何,6
是int
。因此,最好避免对所有具有自己文字的整数类型进行强制转换,在大多数情况下,应将U
和L
作为后缀进行组合。
你能发布错误吗? – nielsbot
您可能会看到的错误是因为预处理器不了解类型名称“int”或cast操作符。 (a)你错过了所需的'#include',(b)'void main()'应该是'int main(void) (c)输出应该以换行符结束:'printf(“T \ n”);'。编译器不需要诊断所有这些问题,但是您绝对应该修复它们。 –
@nielsbot 来自Eclipse IDE的错误:“令牌之前缺少二元运算符”6“” –