5

可能重复:
在 C++ 中使用关键字 class 作为变量名

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

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

4

4 回答 4

8

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

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

这将允许编译继续进行。

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

-Dnew=mynew
于 2010-06-02T07:09:56.510 回答
3

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

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

从长远来看,是的,您应该提请库开发人员注意这一点。

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

于 2010-06-02T07:01:53.143 回答
1

您可以在 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。这允许您在不更改现有库的情况下进行构建。

于 2010-06-02T08:41:12.300 回答
0

如果您正在修改 3rd 方库的完美头文件,我建议您现在停止。如果我理解正确,您正在尝试将 C++ 代码添加到 C 库中,那是不行的,C 无法识别“new”关键字,因为它是 C++ 关键字。

相反,我建议:

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

我希望这会有所帮助,干杯

于 2010-06-02T07:02:28.023 回答