关于c ++:使用g ++编译变量名为new的C代码时出错

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

我们正在尝试修改一些现有的C项目,即我们试图从C代码中生成一些C++函数调用。我们试图将编译器从gcc改为g++,但由于不兼容,出现了一些编译错误。我们要做的是调用C代码中的一些C++函数,而不必对现有代码进行任何更改。仅仅改变编译器似乎并没有做到这一点。因此,我们尝试了以下方法:

1
2
3
4
5
6
7
8
9
#include <stdio.h>

extern"C"
{
    int func(int new ) {
        printf("in new func()
"
);
    }
}

当我使用命令编译它时

g++ -c hello.c -o hello

我们有以下错误

1
hello.c:9: error:expected ‘,’ or ‘...’ before ‘new’.

现在我们知道新的是C++关键字。如前所述,我们试图不修改现有的C代码。有什么建议吗?

这些并不是唯一的错误。还有其他与结构声明相关的错误。

attr.c:75: error: expected primary-expression before ‘.’ token

在ATTR.C,第75行是

static post_op_attr error_attr = {.attributes_follow = FALSE };

问题是代码中还有其他C样式的结构声明和初始化,所以即使我们重命名变量名,我们仍然需要修改C程序的其他部分。因此,我们正在寻找一种在不修改现有C代码的情况下向C代码添加C++函数调用的方法。


new是关键字,因此不能调用变量new。但即使你能,我也不知道为什么你会这样做,因为它难以置信的难读。

即使你使用的是EDCOX1(2),你仍然在用EDCOX1 3编译,这是C++编译器,它会抱怨这一点。

由于C++引入了一些关键字,C代码基本上不能在C++中运行不变。这是一个你不得不改变现有代码C代码以使其编译为C++代码的时候。


正如你所说的EDOCX1,0是一个C++关键字,所以不能用作变量名。

如果您的C代码调用C++函数,那么您应该真正地认为它不是C和更多,而是C++。这将意味着更多(更多的话,如果你想让它成为惯用的C++),那么只需要替换一些被严重命名的变量。

但是,如果您打算对C代码库进行最小的更改,您可以尝试以下方法:

1
#define new new__

但是,我真的不建议把它作为一个长期的解决办法。


C++中标识符的规则是:

1.只允许字母、数字和下划线。

2.标识符名称不能以数字开头。

1
3.Key words cannot be used as a name.

4.大写和小写字母是不同的。

5.不允许使用特殊字符

6.全局标识符不能用作"标识符"。

编辑:关于从C代码调用C++函数的要求,而不需要修改C代码,

一种方法是在C中围绕C++代码编写包装器,然后用GCC编译,这样就不容易直接从G++调用C代码:

如何调用C++中的C++函数?

另外,您可能希望看到:

http://www.thegeekstuff.com/2013/01/mix-c-和-cpp/

http://research.engineering.wustl.edu/~beardj/mixed_c_c++.html

以及

http://www. PARASIFIF.COM/C++-FAQLIT/C-CALLS-CPPP.HTML


new是关键字,如果不想修改代码,不要使用g++。用gcc代替。

注意:如果是C代码,它就不应该包含EDCOX1×2,如果它是C++代码,它就永远不应该使用EDCOX1×0作为变量。


已从已删除的问题中迁移。

外部"C"的作用

extern"C"不会将该代码视为C代码,它只是一个链接选项。

在这里查看这篇文章,了解它的含义。为了使它简短(简单),它改变了函数名如何存储在二进制文件(C++编译器Mangle -装饰函数名称中,因为函数重载:同名,但不同的参数)。只有当你将C库链接到C++模块(或者当你从C++模块导出C接口)时,你才需要它。

C和C++编译器

因为你使用的是C++编译器(G++是C++ GCC前端,迷惑了吗?)看看这篇文章,关于GCC和G+的区别,你的文件将被编译成C++代码,你不能使用C++关键词(如在这个答案中张贴)。

解决方案

要编译C源文件(假设你不能简单地调用EDCOX1,1 C C前端),使用EDCOX1,2,C++前端,你必须使用EDCOX1,3(参见C99 GCC支持的文档)。

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

C和C++是不同的语言,所以用C++编译器编译C代码没有多大意义。

但是你不需要,人们在每天的基础上把C和C++结合在不同的编译单元中。只需创建一个通用头文件toto.h,您将在这两个文件中都包含该头文件。在EDCOX1的2个条件子句中有所有的函数,它们为C而不可见,对于C++是可见的。

1
2
3
4
5
6
7
8
9
#ifdef __cplusplus
extern"C" {
#endif

   // your function declarations (not definitions) go here

#ifdef __cplusplus
}
#endif

现在可以在单独的编译单元(.c文件)中实现函数。这些函数可以毫无问题地相互调用。


每种计算机语言都有一些不允许用作变量名的保留关键字。以下是C语言保留关键字列表,不应将其用作变量名http://www.tutorialspoint.com/ansi_c/c_reserved_key words.htm

还有一件事,因为你正在编译一个C++编译器,所以你也应该避免使用C++保留关键字。这里是一个C++关键字http://cs。

用其他东西改变new,比如用num或其他东西改变new