可能重复:
在 C++ 中使用关键字 class 作为变量名
在我使用的库的 C 头文件中,其中一个变量名为“new”。不幸的是,我在 C++ 项目中使用了这个库,并且“new”作为变量名的出现让编译器感到害怕。我已经在使用 extern "C" { #include<...> },但这似乎在这方面没有帮助。
我是否必须要求库开发人员更改该变量的名称,即使从他的角度来看,作为 C 开发人员,代码绝对没问题,因为“new”不是 C 关键字?
可能重复:
在 C++ 中使用关键字 class 作为变量名
在我使用的库的 C 头文件中,其中一个变量名为“new”。不幸的是,我在 C++ 项目中使用了这个库,并且“new”作为变量名的出现让编译器感到害怕。我已经在使用 extern "C" { #include<...> },但这似乎在这方面没有帮助。
我是否必须要求库开发人员更改该变量的名称,即使从他的角度来看,作为 C 开发人员,代码绝对没问题,因为“new”不是 C 关键字?
在包含头文件之前,使用预处理器重命名new
:
#define new mynew
#include <...>
#undef new
这将允许编译继续进行。
你真的需要访问这个变量吗?如果没有 - 那么你就完成了。如果你这样做了,那么你需要确保库的 .c 文件是用
-Dnew=mynew
是否要求标头包含此变量的名称?如果您使用的是名为“new”的全局变量,那么这当然是要求您具有全局可见变量名的原因。另一方面,如果这类似于名为“new”的函数参数,只需从函数声明中删除该名称即可。如果名称是结构或联合的成员,只要 .C 代码看到名称与源代码匹配的“私有”定义,在头文件中更改它就不会损害 .C 代码。
由于 .C 文件应该以 C 语法编译,因此能够处理名为“new”的变量,因此修复头文件应该是一种有效的解决方法。
从长远来看,是的,您应该提请库开发人员注意这一点。
作为最终的、有点老套的解决方案,您可以将头文件从“new”更改为某个内容,例如“was_new”。并且在编译库的 C 文件时使用编译器开关来强制#define new was_new
.
您可以在 C 中编写自己的包装函数。您使用的所有与库相关的内容都将使用 C 编写,并带有 C++ 友好的头文件。所以,而不是:
其他_lib.h: int foo(int new); my_app.cxx: 外部“C”{ #include <other_lib.h> }
这不会编译,你这样做:
my_wrap.h: #ifdef __cplusplus 外部“C”{ #万一 int my_foo(int); #ifdef __cplusplus } #万一 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。这允许您在不更改现有库的情况下进行构建。
如果您正在修改 3rd 方库的完美头文件,我建议您现在停止。如果我理解正确,您正在尝试将 C++ 代码添加到 C 库中,那是不行的,C 无法识别“new”关键字,因为它是 C++ 关键字。
相反,我建议:
您使用源文件 (*.cpp) 创建一个单独的 C++ 项目,将 #include 添加到该第 3 方头文件,并将库的二进制文件链接(谷歌“链接库”等)到您的项目。
我希望这会有所帮助,干杯