c++ - 通过 ifdef 以编程方式确定标签是否在翻译单元中定义

标签 c++ label conditional-compilation

我有以下代码,我希望给定的 cstdio 包括第一行将被打印,但是第二行被打印。

我做错了什么?编译时能否知道当前翻译单元中是否定义了printf或strncmp或memcpy等标签?

#include <iostream>
#include <cstdio>

int main()
{
   #ifdef printf
      std::cout << "printf is defined.\n";
   #else
      std::cout << "printf NOT defined!\n";
   #endif
   return 0;
}

是因为预处理器运行在变量和标签被引入范围/TU之前吗?

简而言之,下面的代码是伪造的吗? :

http://code.google.com/p/cmockery/source/browse/trunk/src/example/calculator.c#35

最佳答案

#ifdef仅适用于用 #define 定义的预处理器宏,而不是像函数名和变量这样的符号。您可以将预处理器想象成一个实际的独立预备步骤,就像通过 perl 脚本运行您的代码一样,它发生在“真正的”编译器破解它之前。

所以没有编程的方法来检查是否像printf这样的符号在当前范围内定义。如果你使用一个但它没有定义,你会得到一个编译器错误。正常的做法是 #include在您引用它的源文件中具有所需定义的头文件,而不是编写一个可以适应不同可能的头集的源文件。

作为 hack,根据您的环境和具体问题,头文件确实定义了 printf (或您关心的任何功能)也可能包含一些预处理器 #define这是您可以检查的。

关于c++ - 通过 ifdef 以编程方式确定标签是否在翻译单元中定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9969833/

相关文章:

c++ - 一个变量中的 2 个值(const 和 const_cast)c++

apache-flex - 设置 spark.components.Label 的文本颜色

C++ 使用 `const int` 作为循环变量?

c++ - 每个组件 boost 库中的顶点数

c++ - alloca 是 C++ 标准的一部分吗?

python - 在圆环图中隐藏低百分比

c# - 为什么我不能将标签的标签绑定(bind)到 sql 数据?

variables - 如何在 makefile 中定义变量,然后在 Fortran 代码中使用它

conditional-compilation - SSDT项目中模式对象的条件编译

c++ - 可以吗在 Google 测试框架内的 TDD 周期中使用全局数据进行多个测试?