我尝试使用,而不是“的if-else”如下一些条件编译预处理指令编写程序。
#include<stdio.h>
int main ()
{
int x;
scanf ("%d",&x);
#if (x==5)
printf ("x is 5");
#else
printf ("x not 5");
#endif
}
但事实是,它总是打印else部分纵然x
is 5
值。我简单的问题是----->为什么?
是否有可能成功完成此程序(即从用户取x的值,并在使用#如果#if指令和打印语句检查的条件)。
在编译过程中会出现警告“的‘x’没有定义,计算结果为0”。但x
似乎定义了我。这是否意味着x
应使用#define
定义。请解释一下我身后条件编译的概念。
预处理需要编译之前的地方。所以预处理器不知道你的C代码或变量东西。你不能在条件中使用任何C变量。
条件编译是用于不同的目的。
#define DEBUG
/* ....*/
#ifdef DEBUG
printf("Some debug value %d\n", val);
#endif
在#if
语句数可以是唯一不变的,与#define
定义的东西,和一个特殊的defined
运营商。在表达的任何其他标识符与0替换示例代码的x
不与#define
定义,因此(x==5)
变得(0==0)
。
在C 2018标准,第6.10.1告诉我们表达的是评估在#if
语句包括:
#define
定义的东西)根据它们的定义所取代。defined
的用途被替换为0或1。因为在你的示例代码x
不与#define
定义,它是在#if
声明替换为0。这导致(0==5)
,这是假的,所以#if
和#else
之间的代码被跳过。
在预处理语句,可以根据将程序执行过程中设置的值不求变量。
这是“预处理器”。 “预”,“之前”的意思。
你试图预处理过程中使用一个运行时的价值!当然,预处理器构建过程中信息的访问权限。
这个问题不仅限于运行时的值,但更根本的。即使你试图使用一个(命名)编译时常如constexpr int x = 2
,你不能这样做。这是两种语言交织,如产生与PHP HTML;在HTML没有PHP变量的知识,和PHP没有什么部件在页面上的用户点击知识。这些是完全不同的执行上下文与没有内置的相互作用或交叉兼容性。