【问题标题】:Does #ifdef (or other Preprocessor Directives) Work for Function Declarations (to Test for Function Existence)?#ifdef(或其他预处理器指令)是否适用于函数声明(以测试函数是否存在)?
【发布时间】:2011-06-04 04:46:42
【问题描述】:

为什么下面的代码没有按预期工作?

void foobar(int);

#ifndef foobar
  printf("foobar exists");
#endif

总是打印消息;它显然无法检测到函数作为实体的存在。 (是不是过载问题?)

为什么#ifdef(或其变体)不能检测函数声明?声明应该在预处理时可用,所以它应该工作,不是吗?如果没有,是否有替代方案或解决方法?

【问题讨论】:

  • 问题中有错字吗?除非您还有#define foobar 或-Dfoobar,否则我希望它永远不会打印消息。
  • 是的,应该是#ifndef(我在复制测试代码时忘记更新那行)。

标签: c c-preprocessor declaration


【解决方案1】:

声明应在 预处理,所以它应该工作, 不应该吗?

预处理器在编译之前运行(因此是“pre”),因此此时没有编译符号,只有文本和文本扩展。预处理器和编译器明显分开并且彼此独立工作,除了预处理器修改传递给编译器的源。

使用预处理器执行类似操作的典型模式是使用相同的define 常量将函数声明与函数用法配对:

#define FOO

#ifdef FOO
 void foo(int);
#endif

#ifdef FOO
   printf("foo exists");
#endif

【讨论】:

  • 我知道预处理器在编译之前工作,但函数声明已经出现在文本中(在这种情况下,之前的两行)。我想问题是预处理器不理解声明;只有 pre-proc 指令。那么没有实用/自动的方法来测试功能的存在吗? (手动为每个函数创建一个 pre-proc 定义是太多的工作。)
  • 是的。预处理器根本不理解 C 或 C++,因此函数声明只不过是一些文本。你想解决什么特别的问题?也许函数指针或其他东西是您真正想要的。这适用于在运行时,您想查看 dll 是否导出特定方法并使用它。但如果你真的想在编译期间做这样的事情,上面就是这样做的。
【解决方案2】:

预处理器针对使用预处理器指令定义的预处理器令牌工作。预处理器不适用于代码中声明的类型(无论是什么语言)。

您必须使用#define 预处理器指令来声明对其他预处理器条件检查可见的标记。

#define FOO

#if FOO
// this code will compile
int x = 5;
#else
// this code won't
int x = 10;
#endif

【讨论】:

  • 我想当我在 JavaScript 中做一些工作时我有点被宠坏了,你可以做一些事情,比如轻松检查函数/属性是否存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2021-05-23
  • 2017-01-24
  • 2011-04-08
  • 1970-01-01
相关资源
最近更新 更多