条件编译#ifdef

时间:2013-07-23 07:50:38

标签: c macros conditional-compilation

我正在尝试了解#ifdef宏。示例代码如下。

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

即使我将Packet传递给1,我也会得到输出getval。在PKT时未定义val=1时,为什么要输出?感谢。

4 个答案:

答案 0 :(得分:2)

#指令是编译时而不是运行时。所以你传递的内容并不重要。如果定义了宏PKT,那么" Packet"打印,否则不打印。

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

如果从getval函数中删除了一堆预处理程序指令,那么"数据包"将不会打印,因为在这种情况下PKT未定义,因此#ifdef PKT为false且printf未到达编译器。

答案 1 :(得分:2)

在实际编译之前,预处理器评估#define PKT的那一部分,而不是在程序执行期间。因此,它不受if(val==0)条件的约束。

答案 2 :(得分:2)

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

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

始终完成#define。否则说,你的代码等同于define在函数外部的相同代码。见https://en.wikipedia.org/wiki/C_preprocessor

答案 3 :(得分: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");
}