2013-07-23 55 views
0

我想了解#ifdef宏。下面的示例代码。有条件汇编#ifdef

getval(int val) 
{ 
    if(val==0) { 
    #ifndef PKT 
    #define PKT 
    #endif 
    } 
} 
main() { 
getval(0); 
#ifdef PKT 
printf("Packet\n"); 
#endif 
} 

我得到的输出Packet甚至当我通过1getval。当val=1没有定义PKT时,为什么我会得到输出?谢谢。

+3

或者,你可以使用枚举。 – Alexis

+1

这个答案会帮助你http://stackoverflow.com/questions/17349387/scope-of-macros-in-c/17349448 – VoidPointer

回答

2

#指令是编译时间而不是运行时间。所以你传递什么并不重要。如果定义了宏PKT,则打印“分组”,否则不打印。

如果您正在运行gcc,则可以执行gcc -E myfile.c并在预处理后检查结果。

如果您从getval功能删除预处理指令的一群,那么“数据包”不会被打印出来,因为在这种情况下PKT没有定义,因此#ifdef PKT是假的和printf没有达到编译。

2

#define PKT由预处理器在实际编译之前进行评估,而不是在编程执行期间进行评估。因此,它不受条件if(val==0)

2

#define#ifdef在编译时评估(实际上甚至在编译之前)。它们在文本文件上进行评估,与下面的C代码无关。因此在

if(val==0) { 
    #ifndef PKT 
    #define PKT 
    #endif 
} 

#define总是完成。否则说,你的代码等同于定义在函数之外的相同代码。见https://en.wikipedia.org/wiki/C_preprocessor

+0

那么'#ifndef'指令有什么用处呢。只有在定义了“PKT”的情况下,我如何才能实现打印“数据包”的目的。 –

+0

如果定义了PKT,则您已经有条件地打印。只有定义PKT的事实是通过**线性读取源文件**而不是**执行**来计算的。你能解释你想做什么吗? – hivert

+0

我只是试图有条件地使用if指令。 –

1

该代码可以用来代替:

#define val 0 

#if val==0 
    #ifndef PKT 
    #define PKT 
    #endif 
#endif //val == 0 

int main() 
{ 
#ifdef PKT 
    printf("Packet\n"); 
#endif 
} 

但是,请注意,已编译之前定义VAL。由于定义不是在运行时执行

typedef enum {PKT, NO_PKT} Packet; 
Packet p; 

getval(int val) 
{ 
    if (val == 0) 
    p = PKT; 
    else 
    p = NO_PKT; 
} 

int main() 
{ 
    getval(1); 
    if (p == PKT) 
     printf("Packet\n"); 
}