【问题标题】:Casting with #if in C在 C 中使用#if 进行强制转换
【发布时间】:2016-04-22 21:44:25
【问题描述】:

为什么这段代码会出错:

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

     #endif

return 0;
}
  1. 为什么它拒绝强制转换?
  2. 是“预处理器错误”还是“编译器错误”?

【问题讨论】:

  • 你能发布错误吗?
  • 您可能看到的错误是因为预处理器不理解类型名称int 或强制转换运算符。您没有看到或只是忽略的错误或警告是因为 (a) 您缺少所需的 #include &lt;stdio.h&gt;,(b) void main() 应该是 int main(void),并且 (c) 输出应该是以换行符结束:printf("T\n");。编译器不需要诊断所有这些问题,但您绝对应该修复它们。
  • @nielsbot 来自 Eclipse IDE 的错误:“在令牌“6”之前缺少二进制运算符”
  • @MinaSamir,这实际上是 Eclipse 的出色表现,请看我的回答。

标签: c casting compiler-errors c-preprocessor


【解决方案1】:

这是一个预处理器错误。发生这种情况是因为预处理器不了解如何转换变量。您不能将任何 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;
}

【讨论】:

  • 这是一个狡猾的小宏。
  • 只需#define Rep ((int)+6) 就可以了。但是等等,6 是一个 int,所以为什么要一起演员。
  • @JensGustedt 我不同意这更简单,因为它不同于典型的强制转换语法。这意味着您必须修改常量以添加 hack。如果你可以修改常量,那么去掉没有效果的演员不是更好吗?
  • 这是一个真实的例子,你不能修改常量。 stackoverflow.com/questions/19406246/…
  • @Ville-ValtteriTiittanen 确保在某些情况下您无法控制宏。但如果你这样做,你应该像我在回答中描述的那样去做。首先,如果存在相关类型的文字,则完全避免强制转换,然后使用 + 技巧而不是依赖另一个宏。
【解决方案2】:

Preprossor 组合了强制转换并且仍然可以在#if 中工作的宏很容易编写:您只需在数字前添加一点+。你的情况

#define Rep ((int)+6)

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

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

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 2014-03-07
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多