C++ 通过ifdef以编程方式确定标签是否在翻译单元中定义
我有下面的代码,我希望给定cstdio,第一行将被打印,而第二行将被打印 我做错了什么?是否可以知道在编译时是否在当前翻译单元中定义了printf、strncmp或memcpy等标签C++ 通过ifdef以编程方式确定标签是否在翻译单元中定义,c++,label,conditional-compilation,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 <
#include <iostream>
#include <cstdio>
int main()
{
#ifdef printf
std::cout << "printf is defined.\n";
#else
std::cout << "printf NOT defined!\n";
#endif
return 0;
}
#包括
#包括
int main()
{
#ifdef printf
std::cout您可以使用原始include文件中的保护来确定它们是否被包含,从而声明函数
例如,我的MSVS2010附带的
具有\u INC\u STDIO
防护装置。因此,您的代码应该如下所示:
int main()
{
#ifdef _INC_STDIO
std::cout << "printf is defined.\n";
#else
std::cout << "printf NOT defined!\n";
#endif
return 0;
}
intmain()
{
#ifdef公司
std::cout#ifdef
仅适用于用#define
定义的预处理器宏,而不适用于函数名和变量等符号。您可以将预处理器想象为一个实际单独的初步步骤,就像通过perl脚本运行代码一样,在“真正的”编译器出现问题之前发生
因此,没有编程方法来检查像printf
这样的符号是否在当前范围内定义。如果您使用了一个符号,但它没有定义,您将得到一个编译器错误。通常要做的是#在引用它的源文件中包含一个具有所需定义的头文件,而不是编写源文件它将使自己适应不同的可能的标题集
作为黑客,根据您的环境和具体问题,定义printf
(或您关心的任何函数)的头文件还可能包含一些可以检查的预处理器#define
。它们是stdio.h中的大量符号,它们是#define
d,由cstdio导入
所以你可以用
#include <iostream>
#include <cstdio>
int main()
{
#ifdef stdin
std::cout << "printf is defined.\n";
#else
std::cout << "printf NOT defined!\n";
#endif
return 0;
}
#包括
#包括
int main()
{
#ifdef-stdin
std::cout标准库函数,如printf
不是预处理器宏(或您所称的“标签”)。您不能使用预处理器以编程方式检测它们是否已定义。您实际试图如何处理这些信息?ifdef
不适用于函数定义、变量或类似的内容…它适用于通过\define
预处理器指令定义的内容。换句话说,t预处理器只能用#ifdef
测试的符号是用#define
或通过-D命令行创建的符号。预处理器符号不是函数的名称。正如John Calsbeek所问的,你想做什么?@JohnCalsbeek:我用启动我调查的代码更新了这个问题。@XanderTulip该代码的全部目的是检测是否有其他人碰巧定义了与printf
同名的宏,如果是,则删除该定义,以便他们可以用自己选择的内容替换printf
。该条件仅在有printf
宏定义时运行,而不是如果一般定义了printf
。也可能包含-肯定也会包含。@suddnely\u me--不一定。例如,非标准库的私有头文件可能不包含任何防护(我知道--ech),或者在某些编译器中,保护可能是#pragma once
而不是#define
好的,我同意,它应该是的。