Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过ifdef以编程方式确定标签是否在翻译单元中定义_C++_Label_Conditional Compilation - Fatal编程技术网

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

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 <

我有下面的代码,我希望给定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;
}
#包括
#包括
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
好的,我同意,它应该是
的。