如果在翻译单元中定义了标签,则通过ifdef以编程方式确定

Xan*_*lip 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

总之是以下代码伪造?:

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

Eri*_*ric 6

#ifdef仅适用于预处理器宏,使用#define,而不是像函数名称和变量这样的符号.您可以将预处理器想象成一个实际的单独的初步步骤,比如通过perl脚本运行代码,这在"真正的"编译器得到破解之前发生.

因此,没有编程方法来检查printf当前范围中是否定义了符号.如果您使用一个并且未定义,则会出现编译器错误.通常要做的事情是#include在源文件中引用它的头文件中包含所需的定义,而不是编写一个能够使自己适应不同可能的头文件集的源文件.

作为一个hack,并且根据您的环境和特定问题,定义的头文件printf(或您关心的任何函数)也可能包含一些#define您可以检查的预处理器.