我正在尝试理解#ifdef宏。下面是示例代码。
getval(int val)
{
if(val==0) {
#ifndef PKT
#define PKT
#endif
}
}
main() {
getval(0);
#ifdef PKT
printf("Packet\n");
#endif
}即使当我将1传递给getval时,也会得到输出Packet。为什么当val=1时没有定义PKT时,我会得到输出?谢谢。
发布于 2013-07-23 15:53:01
#指令是编译时而不是运行时。所以你通过了什么并不重要。如果定义了宏包,则打印“PKT”,否则不打印。
如果您运行的是gcc,您可以执行gcc -E myfile.c,并在预处理后检查结果。
如果您从getval函数中删除了一堆预处理器指令,那么将不会打印“数据包”,因为在这种情况下没有定义PKT,因此#ifdef PKT为false,并且printf无法到达编译器。
发布于 2013-07-23 15:55:16
预处理器在实际编译之前而不是在程序执行期间对#define PKT进行计算的那部分。因此,它不受条件if(val==0)的约束。
发布于 2013-07-23 15:56:02
#define和#ifdef是在编译时(实际上甚至在编译之前)计算的。它们是在一个文本文件上计算的,独立于下面的C代码。因此,在
if(val==0) {
#ifndef PKT
#define PKT
#endif
}#define总是完成的。换句话说,您的代码等同于定义在函数外部的相同代码。请参阅https://en.wikipedia.org/wiki/C_preprocessor
https://stackoverflow.com/questions/17804373
复制相似问题