0

我试图理解#ifdef宏。下面的示例代码。

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

Packet即使我传递1getval. 为什么我在PKT未定义时得到输出val=1?谢谢。

4

4 回答 4

2

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

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

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

于 2013-07-23T07:56:01.753 回答
2

这些#指令是编译时而不是运行时。所以你通过什么并不重要。如果定义了宏PKT,则打印“数据包”,否则不打印。

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

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

于 2013-07-23T07:53:01.083 回答
2

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

于 2013-07-23T07:55:16.250 回答
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");
}
于 2013-07-23T08:18:56.903 回答