2016-04-22 69 views
2

为什么这个代码给出了一个错误:与#如果铸造用C

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

    #endif 

return 0; 
} 
  1. 为什么会拒绝铸造?
  2. 它是'预处理器错误'还是'编译器错误'?
+0

你能发布错误吗? – nielsbot

+0

您可能会看到的错误是因为预处理器不了解类型名称“int”或cast操作符。 (a)你错过了所需的'#include ',(b)'void main()'应该是'int main(void) (c)输出应该以换行符结束:'printf(“T \ n”);'。编译器不需要诊断所有这些问题,但是您绝对应该修复它们。 –

+0

@nielsbot 来自Eclipse IDE的错误:“令牌之前缺少二元运算符”6“” –

回答

5

这是一个预处理器错误。发生这种情况是因为预处理器不知道如何投射变量。您不能在#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; 
} 
+5

这是一个狡猾的小宏。 –

+0

只是'#define Rep((int)+6)'会做。但是等一下,'6'是一个'int',那么为什么要把所有的东西放在一起。 –

+0

@JensGustedt我不认为这很简单,因为它与典型的演员语法不同。这意味着你必须修改常量来添加黑客。如果你可以修改这个常量,那么更好的想法是不要删除没有效果的演员阵容? –

1

Preprossor宏写:你只需在号码前加点+。在你的情况

#define Rep ((int)+6) 

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

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