【问题标题】:Pre-processor Directives (#if and #endif) not working in C预处理器指令(#if 和 #endif)在 C 中不起作用
【发布时间】:2021-01-10 10:18:48
【问题描述】:

我编写了一个简单的代码来理解 C 中的预处理器指令:

#include <stdio.h>

int main(void)
{
    int a;
    printf("Enter any value : ");
    scanf("%d", &a);
#if a
    printf("The number you entered is non-zero.\n");
    return 0;
#endif
    printf("The number entered is zero.\n");
    return 0;
}

输出如下:

当输入值为零时

Enter any value : 0
The number entered is zero.

当输入的值非零时

Enter any value : 5
The number entered is zero.

作为预处理器#if 检查下一个令牌。如果为零,则跳过代码,如果为非零,则正常执行代码。

但是这里的代码在这两种情况下都被跳过了。你能解释一下这里出了什么问题吗?

【问题讨论】:

  • 这就是if..else 条件语句存在的原因。否则它会是多余的。

标签: c c-preprocessor


【解决方案1】:

这个预处理器检查

#if a
...
#endif

在编译时执行,与

完全无关
int a;

要使#if a 成为true,您需要前面的语句,例如

#define a 42

要使#if a 成为false,您需要前面的语句,例如

#define a 0

但是如果你只是有

#define a

它本身是有效的,但没有定义可测试的值,那么编译器会发出类似的错误

错误 C1017:无效的整数常量表达式

但是拥有#define a 42 意味着您不能使用a 来定义变量,因为

int a;

将扩展到

int 42;

这是一个错误。

【讨论】:

  • 那么这个预处理器有什么用呢?我的意思是当我们#define a 1 它只是意味着我们希望预处理器命令中的代码运行,那么为什么要使用预处理器呢。然后我们可以简单地编写我们想要在没有预处理器的情况下始终执行的代码。
  • 假设我有一个包含42 元素的数组。我可以在数组定义和每个循环中对该长度进行硬编码,或者我可以#define ARRLEN 42 并在整个代码中使用单个定义。像这样的宏也可以用来控制条件编译
  • 您编写的代码完全不适合使用预处理器。有适当的用途。你最终会明白这一点的。
  • @Neeraj-Kumar-Coder 为什么要使用预处理器。考虑gcc -o demo demo.c -DDEBUG=1和代码#if DEBUG ...。现在有意义吗?
  • ... 这种做法有很多好处。一种是您可以在单个定义的一个位置更改数组长度及其所有用法。另一个是假设你有一个更常见的值,比如8,在不同的地方有不同的用法。如果您想将其中一个从 8 更改为 10,那么您必须详细阅读所有代码以了解 哪些 8 值需要更改,以及哪些 @ 987654343@ 涉及不同方面的值不需要更改。但是如果你有#define LENA 8#define LENB 8 它们的用法是不同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2012-06-08
  • 2022-11-29
  • 2010-09-22
  • 2016-11-18
相关资源
最近更新 更多