C++ C++';新';关键词与C

C++ C++';新';关键词与C,c++,c,new-operator,keyword,extern,C++,C,New Operator,Keyword,Extern,可能重复: 在库的C头文件中,我正在使用一个名为“new”的变量。不幸的是,我在C++项目中使用这个库,而“新”作为变量名的出现吓跑了编译器。我已经在使用extern“C{#include},但在这方面似乎没有帮助 我是否必须要求库开发人员更改该变量的名称,即使从他的角度来看,作为一名C开发人员,代码绝对没有问题,因为“new”不是C关键字?是否要求标题包含该变量的名称?如果您使用的是一个名为“new”的全局变量,那么这当然是要求您具有全局可见变量名的原因。另一方面,如果这类似于名为“new”

可能重复:

在库的C头文件中,我正在使用一个名为“new”的变量。不幸的是,我在C++项目中使用这个库,而“新”作为变量名的出现吓跑了编译器。我已经在使用extern“C{#include},但在这方面似乎没有帮助


我是否必须要求库开发人员更改该变量的名称,即使从他的角度来看,作为一名C开发人员,代码绝对没有问题,因为“new”不是C关键字?

是否要求标题包含该变量的名称?如果您使用的是一个名为“new”的全局变量,那么这当然是要求您具有全局可见变量名的原因。另一方面,如果这类似于名为“new”的函数参数,只需从函数声明中删除该名称即可。如果名称是结构或联合的成员,则在头文件中更改它不会损害.C代码,只要.C代码看到名称与源代码匹配的“私有”定义

由于.C文件应该用C语法编译,因此能够处理名为“new”的变量,因此修复头文件应该是一个有效的解决方法

从长远来看,是的,您应该引起库开发人员的注意


作为最后一个有点老套的解决方案,您可以将头文件从“new”更改为“was_new”。在编译库的C文件时,使用编译器开关强制执行
#define new was_new

如果您正在修改第三方库的完美头文件,我建议您现在停止。如果你想正确理解C,那么你就尝试把C++代码添加到C库中,这样做是不行的,C不承认“新”关键字,因为它是C++关键字。 相反,我建议:

创建一个单独的C++项目,其中包含源文件(*.CPP),向该第三方头文件添加一个“包含”,以及链接(谷歌)链接LIBS等)库的二进制文件到项目。

我希望这有点帮助,
干杯

在包含头文件之前,请使用预处理器重命名
新建

#define new mynew
#include <...>
#undef new

<>你可以在C中编写自己的包装器函数。你使用的所有触摸库都将用C++友好的头文件在C中编写。因此,不是:

other_lib.h: int foo( int new ); my_app.cxx: extern "C" { #include <other_lib.h> } 其他_lib.h: int foo(int new); my_app.cxx: 外部“C”{ #包括 } 如果无法编译,则执行以下操作:

my_wrap.h: #ifdef __cplusplus extern "C" { #endif int my_foo( int ); #ifdef __cplusplus } #endif my_wrap.c: #include <other_lib.h> int my_foo( int x ) { return foo( x ); } my_app.cxx: #include "my_wrap.h" ... 我的_wrap.h: #ifdef_uucplusplus 外部“C”{ #恩迪夫 int my_foo(int); #ifdef_uucplusplus } #恩迪夫 我的(u wrap.c): #包括 int my_foo(int x){return foo(x);} my_app.cxx: #包括“my_wrap.h” ...

用C编译器编译MyApReal.c,然后用C++编译器编译MyAppApp.cxx。


这允许您在不更改现有库的情况下进行构建。

库开发人员决定命名一个全局变量
new
?我认为这基本上是Damn的重复。你是怎么找到那个的,sbi?在发布之前,我真的试图找到答案,但从来没有遇到过这个问题。别担心,我记得这是最近的一个问题(虽然我不记得它是哪个关键字),但我还是用SO的搜索功能尝试了几次才找到。最后,我认为“包括标题关键字”在前六个点击中出现了,但我不确定……我仍然打开了搜索选项卡,因此我可以确定:包括“C”标题“C++”关键字(我不确定引号是否能改善搜索效果,它们在谷歌中确实如此,所以我确信它们在我的肌肉记忆中。然后希望现在还没有一个名为
mynew
:)的现有变量。)我不需要访问它,它只是函数声明中的一个参数。我看到了你的标题:因为预处理器用“MyNew”替换“新”,C++编译器永远不会看到头文件中的“新”,而只有“MyNeX”,它不是C++关键字,因此可以使用。问题,如果使用“-Dnew=mynew”部分。第一部分应该很好,在我的情况下就足够了。@Florian:是的,没错!@dreamlax::)我知道我可以简单地删除或重命名该变量,因为它只在函数声明中使用。我正在寻找一种解决方案,使库的C头文件保持不变。如果这还不够清楚,我很抱歉。谢谢你的回答。最后我更改了头文件,我会联系库开发人员,实际上我根本不想修改C头文件,因为它是库的一部分。我正在寻找一种解决方案,它只依赖于改变我自己的C++源代码。不连接库是问题,但是编译我自己项目的C++源代码,因为它仍然包含来自库的C头,而那些——虽然有效C——不是有效C++。 my_wrap.h: #ifdef __cplusplus extern "C" { #endif int my_foo( int ); #ifdef __cplusplus } #endif my_wrap.c: #include <other_lib.h> int my_foo( int x ) { return foo( x ); } my_app.cxx: #include "my_wrap.h" ...