Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在if中更改变量时遇到的问题_C_If Statement_C Preprocessor - Fatal编程技术网

C 在if中更改变量时遇到的问题

C 在if中更改变量时遇到的问题,c,if-statement,c-preprocessor,C,If Statement,C Preprocessor,我在理解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;

我在理解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。为什么?

预处理器指令在编译程序之前会被解释。所以VAR不知道a和b。看

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

#define VAR(a,b) (a | b)
…并像这样使用它:

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

您必须调整您的程序,因为a和b不属于您的主要功能范围。

我见过一些重复,但现在找不到。如果是预处理器指令,则在编译之前执行,并且不再存在于最终程序中。你得到f==0,因为VAR什么都不是,预处理器甚至不知道a或b。呃,你是在跟foo中那些没有支撑的if/else行开玩笑吧?它只是一个样本,我可以这样做:定义VARa,ba | b,然后定义BIGVAR,如果BIGVAR=0?@user3623498不,你不能。不要试图找到像这样的黑客,这是行不通的。您需要在某个时刻将参数传递给宏。但是如果。。。。仍然是一个预处理器指令,如果