在C条件编译#if和#else指令(和其他人)的工作

问题描述 投票:-1回答:4

我尝试使用,而不是“的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部分纵然xis 5值。我简单的问题是----->为什么?

是否有可能成功完成此程序(即从用户取x的值,并在使用#如果#if指令和打印语句检查的条件)。

在编译过程中会出现警告“的‘x’没有定义,计算结果为0”。但x似乎定义了我。这是否意味着x应使用#define定义。请解释一下我身后条件编译的概念。

c c-preprocessor preprocessor conditional-compilation preprocessor-directive
4个回答
3
投票

x不是整数字面或一个整数文字表达(整数常量+运营商)或扩展到那些宏,因此在条件,预处理器与06.10.1p4)替换它。 0==5是假的,所以#else分支被采用。

预处理不知道C声明,种类和。它仅适用于令牌(并最终扩展到这些宏)。


6.10.1p4

由于宏扩展和定义的一元运算符的所有替代已经被执行之后,所有剩余的标识符(包括那些词法相同关键字)被替换为PP-号0,然后将每个预处理标记被转换成令牌。


1
投票

预处理需要编译之前的地方。所以预处理器不知道你的C代码或变量东西。你不能在条件中使用任何C变量。

条件编译是用于不同的目的。

#define DEBUG

/* ....*/ 

#ifdef DEBUG 
printf("Some debug value %d\n", val);
#endif

0
投票

#if语句数可以是唯一不变的,与#define定义的东西,和一个特殊的defined运营商。在表达的任何其他标识符与0替换示例代码的x不与#define定义,因此(x==5)变得(0==0)

在C 2018标准,第6.10.1告诉我们表达的是评估在#if语句包括:

  • 预处理宏(用#define定义的东西)根据它们的定义所取代。
  • 的操作者defined的用途被替换为0或1。
  • 任何剩余的标识符替换为0。

因为在你的示例代码x不与#define定义,它是在#if声明替换为0。这导致(0==5),这是假的,所以#if#else之间的代码被跳过。

在预处理语句,可以根据将程序执行过程中设置的值不求变量。


-2
投票

这是“预处理器”。 “预”,“之前”的意思。

你试图预处理过程中使用一个运行时的价值!当然,预处理器构建过程中信息的访问权限。

这个问题不仅限于运行时的值,但更根本的。即使你试图使用一个(命名)编译时常如constexpr int x = 2,你不能这样做。这是两种语言交织,如产生与PHP HTML;在HTML没有PHP变量的知识,和PHP没有什么部件在页面上的用户点击知识。这些是完全不同的执行上下文与没有内置的相互作用或交叉兼容性。

© www.soinside.com 2019 - 2024. All rights reserved.