首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件编译#ifdef

条件编译#ifdef
EN

Stack Overflow用户
提问于 2013-07-23 15:50:38
回答 4查看 956关注 0票数 0

我正在尝试理解#ifdef宏。下面是示例代码。

代码语言:javascript
复制
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时,我会得到输出?谢谢。

EN

回答 4

Stack Overflow用户

发布于 2013-07-23 15:53:01

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-23 15:55:16

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-23 15:56:02

#define#ifdef是在编译时(实际上甚至在编译之前)计算的。它们是在一个文本文件上计算的,独立于下面的C代码。因此,在

代码语言:javascript
复制
if(val==0) {
   #ifndef PKT
   #define PKT
   #endif
}

#define总是完成的。换句话说,您的代码等同于定义在函数外部的相同代码。请参阅https://en.wikipedia.org/wiki/C_preprocessor

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17804373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档