我有以下代码,我希望给定的 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/