我正在尝试了解#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
时,为什么要输出?感谢。
答案 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");
}