用g++编译变量名为new的C代码时出错

Error in compiling C code with variable name new with g++

本文关键字:代码 出错 new g++ 编译 变量名      更新时间:2023-10-16

我们正在尝试修改一些现有的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源文件(假设不能简单地调用gccC前端),必须使用-std=c99(有关C99GCC支持,请参阅本文档)。

g++ -c -std=c99 hello.c -o hello