用g++编译变量名为new的C代码时出错
Error in compiling C code with variable name new with g++
我们正在尝试修改一些现有的C项目,即我们正在尝试从C代码中进行一些C++函数调用。我们尝试将编译器从gcc更改为g++,但由于不兼容,出现了一些编译错误。我们正在尝试调用C代码中的一些C++函数,而不对现有代码进行任何更改。简单地更改编译器似乎并没有奏效。因此,我们尝试了以下方法:
#include <stdio.h>
extern "C"
{
int func(int new ) {
printf("in new func()n");
}
}
当我使用命令编译它时
g++-c你好.c-o你好
我们得到以下错误
hello.c:9: error:expected ‘,’ or ‘...’ before ‘new’.
现在我们知道new是c++关键字。如前所述,我们尽量不对现有的C代码进行任何修改。有什么建议吗?
这些并不是唯一的错误。还有其他与结构声明有关的错误。
attr.c:75:错误:"."之前应为主表达式代币
在属性c,第75行是
静态post_op_attr error_attr={.attributes_follow=FALSE};
问题是代码中还有其他C风格的结构声明和初始化,所以即使我们重命名变量名,我们仍然必须修改C程序的其他部分。因此,我们正在寻找一种在不修改现有C代码的情况下向C代码添加C++函数调用的方法。
new
是一个关键字,因此不能调用变量new
。但即使你可以,我也不确定你为什么会这样做,因为它非常难阅读。
即使您使用的是extern "C"
,您仍然使用g++
编译,这是c++编译器,它会抱怨这一点。
基本上,由于C++引入了一些关键字,所以C代码在C++中不能始终保持不变。在这种情况下,您别无选择,只能更改一些现有的代码C代码,使其编译为C++代码。
正如您所说的new
是一个C++关键字,因此不能用作变量名。
如果你的C代码正在调用C++函数,那么你真的应该认为它不是C或更多,而是C++。这意味着更多(如果你想让它成为C++的惯用语言,那就意味着更多),而不仅仅是替换几个命名不正确的变量。
但是,如果你打算对你的C代码库进行最小的更改,你可以尝试这个破解:
#define new new__
但是,我真的不建议将其作为长期解决方案。
new
是关键字,如果不想修改代码,请不要使用g++。请改用gcc
。
注意:如果是c代码,则不应包含extern "C"
;如果是c++代码,则永远不应使用new
作为变量。
C++中的标识符规则为:
1.只允许使用字母、数字和下划线。
2.标识符名称不能以数字开头。
3.Key words cannot be used as a name.
4.大写字母和小写字母不同。
5.不允许使用特殊字符
6.全局标识符不能用作"标识符"。
EDIT:关于您从C代码调用C++函数的要求,无需修改C代码,
一种方法是用C语言在C++代码周围编写一个包装器,然后用gcc编译,直接从g++调用C代码并不容易,如下所述:
如何从C调用C++函数?
你也可能想看看这个:
http://www.thegeekstuff.com/2013/01/mix-c-and-cpp/
http://research.engineering.wustl.edu/~beardj/Mixed_C_C++.html
以及
http://www.parashift.com/c++-faq-lite/c-calls-cpp.html
每种计算机语言都有一些保留关键字,不允许用作变量名。以下是c语言保留关键字的列表,您不应将其用作变量名http://www.tutorialspoint.com/ansi_c/c_reserved_keywords.htm
当你在c++编译器上编译时,你还应该避免使用c++保留关键字,这里有一个c++关键字的链接http://cs.smu.ca/~porter/csc/ref/cpp_keywords.html
将new
更改为其他内容,如将new
更改为num
或其他任何内容。
C和C++是不同的语言,因此用C++编译器编译C代码没有多大意义。
但你不需要,人们每天都会在不同的编译单元中组合C和C++。只需创建一个公共头文件toto.h
,即可将其包含在两者中。将所有函数都放在extern "C"
子句中,使其对C不可见,对C++可见。
#ifdef __cplusplus
extern "C" {
#endif
// your function declarations (not definitions) go here
#ifdef __cplusplus
}
#endif
现在,您可以在单独的编译单元(.c文件)中实现您的函数。这些函数可以毫无问题地相互调用。
从已删除的问题迁移。
外部"C"的作用
extern "C"
不会使该代码被视为C代码,它只是一个链接选项。
查看SO上的这篇文章,了解更多关于它含义的信息。简而言之,它改变了函数名称在二进制文件中的存储方式(C++编译器损坏-装饰-函数名称是因为函数重载:相同的名称但不同的参数)。只有当您将C库链接到C++模块时(或者当您从C++模块导出C接口时),才需要它。
C和C++编译器
因为你使用的是C++编译器(g++是C++GCC的前端,困惑吗?看看这篇关于GCC和g++之间区别的文章),你的文件将被编译为C++代码,并且你不能使用C++关键字(如本回答中所述)。
解决方案
要使用g++
C++前端编译C源文件(假设不能简单地调用gcc
C前端),必须使用-std=c99
(有关C99GCC支持,请参阅本文档)。
g++ -c -std=c99 hello.c -o hello
- 在Linux for Windows上编译C++代码时出错
- 尝试将另一个子句添加到代码中时出错
- 将代码从 Python 转换为 C++ 时出错
- <limits> 使用 VSC2019 编译旧代码时出错
- 使用 Visual Studio 代码读取 C++ 中的输入流时出错
- 在OpenGL中使用程序集代码渲染视频时出错
- 编译以下代码时出错
- Boost FFT示例-编译时出错,这段代码在做什么
- 编译在 Python 代码内部调用的 C++ 代码时出错,使用 Boost Python
- C++:为什么这段代码会出错?多元线性回归
- 混合开放MP/MPI代码中的多线程发送/接收时出错
- 将节点 js 代码集成到 cpp 库时出错
- 构建代码时出错
- 在字符串流中使用来自 github 的代码时出错
- 在主代码中调用 .hpp 函数时出错
- 将 find_if() 与数组一起使用的代码段中出错
- 这段带有副本C++08的代码出错
- 我在做什么这个C++代码出错了
- 我的函数代码出错(停止工作)
- 打开txt文件并创建值返回函数的代码出错