【问题标题】:Problems changing variable in #if#if 中更改变量的问题
【发布时间】:2018-04-04 06:55:44
【问题描述】:

我在理解 #if 预处理器指令的工作原理方面存在一些问题。

从此代码:

int a, b;

#define VAR (a | b) 

void foo(int x)
{
    if(x)
        a = smth;
        b = smth2;
    else
        a = xmth;
        b = xmth2;
}   
int main()
{
    foo(x);
    #if(VAR != 0)
    {
        f = VAR;
    }
}

我只能更改foo(),但无论xmth/smth 的值如何,我都会得到f=0。为什么?

【问题讨论】:

  • 我见过一些骗子,但现在找不到。 #if 是一个 preprocessor 指令,它在 before 编译之前执行,并且在最终程序中不再存在。你得到f==0 因为VAR 什么都不是,预处理器甚至不知道ab
  • 呃,你在和foo() 中那些没有支撑的if/else 行开玩笑吧?
  • 这只是一个示例

标签: c if-statement c-preprocessor


【解决方案1】:

在编译程序之前解释预处理器指令。所以VAR 不知道ab。见C preprocessor on Wikipedia


相反,您可以创建一个带有参数的宏,如下所示:

#define VAR(a,b) (a | b)

...然后像这样使用它:

#if (VAR(a,b) != 0)

您必须调整您的程序,因为 ab 不属于您的 main() 函数的范围。

【讨论】:

  • 我可以这样:#define VAR(a,b) (a | b) 然后#define BIGVAR VAR#if (BIGVAR !=0)
  • @user3623498 不,你不能。不要试图找到这样的黑客,它不会工作。您需要在某些时候将参数传递给您的宏。
  • 但是 #if.... 仍然是一个预处理器指令, foo() 将无法更改与此 #if 相关的任何内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2016-02-24
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多