C ++'new'关键字和C.

时间:2010-06-02 06:52:47

标签: c++ c new-operator keyword extern

  

可能重复:
  Use the keyword class as a variable name in C++

在库的C头文件中,我使用其中一个变量命名为'new'。不幸的是,我在C ++项目中使用这个库,并且“new”作为变量名称的出现吓坏了编译器。我已经在使用extern“C”{#include< ...>但是,在这方面似乎没有帮助。

我是否需要让库开发人员更改该变量的名称,即使从他的角度来看,作为C开发人员,代码绝对正常,因为“new”不是C关键字?

4 个答案:

答案 0 :(得分:7)

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

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

这将允许继续编译。

你真的需要访问这个变量吗?如果没有 - 那么你就完成了。如果这样做,那么你需要确保库的.c文件是用

编译的
-Dnew=mynew

答案 1 :(得分:3)

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

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

从长远来看,是的,你应该引起图书馆开发人员的注意。

作为最终的,有点hacky的解决方案,您可以将头文件从“new”更改为某些内容,例如“was_new”。在编译库的C文件时,使用编译器开关来强制执行#define new was_new

答案 2 :(得分:1)

您可以在C中编写自己的包装函数。您使用的所有将触及库的内容都将使用C ++编写友好的头文件。所以,而不是:

other_lib.h:
int foo( int new );

my_app.cxx:
extern "C" {
#include <other_lib.h>
}

将无法编译,你这样做:

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"

...

使用C编译器编译my_wrap.c,然后使用C ++编译器编译my_app.cxx。 这允许您在不对现有库进行任何更改的情况下进行构建。

答案 3 :(得分:0)

如果您要修改第三方库的完美精美的头文件,我建议您现在就停止。您正在尝试将C ++代码添加到C库中,如果我理解正确,那么C不会识别“新”关键字,因为它是C ++关键字。

相反,我建议:

您使用源文件(* .cpp)创建一个单独的C ++项目,在该第三方头文件中添加#include,并将库的二进制文件链接(google“链接库”等)到您的项目中。< / p>

我希望有所帮助, 干杯