在库的C头文件中,我使用其中一个变量命名为'new'。不幸的是,我在C ++项目中使用这个库,并且“new”作为变量名称的出现吓坏了编译器。我已经在使用extern“C”{#include< ...>但是,在这方面似乎没有帮助。
我是否需要让库开发人员更改该变量的名称,即使从他的角度来看,作为C开发人员,代码绝对正常,因为“new”不是C关键字?
答案 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>
我希望有所帮助, 干杯