用变量名new和g编译C代码时出错++ 我们正在尝试修改一些现有的C项目,即我们试图从C代码中调用C++函数。我们尝试将编译器从gcc更改为g++,但由于不兼容,出现了几个编译错误。我们试图做的是调用C代码中的一些C++函数,而不必对现有代码进行任何更改。简单地更改编译器似乎并没有奏效。因此,我们尝试了以下方法: #include <stdio.h> extern "C" { int func(int new ) { printf("in new func()\n"); } } 现在我们知道新的是C++关键字。如前所述,我们试图不对现有的C代码进行任何修改。有什么建议吗

用变量名new和g编译C代码时出错++ 我们正在尝试修改一些现有的C项目,即我们试图从C代码中调用C++函数。我们尝试将编译器从gcc更改为g++,但由于不兼容,出现了几个编译错误。我们试图做的是调用C代码中的一些C++函数,而不必对现有代码进行任何更改。简单地更改编译器似乎并没有奏效。因此,我们尝试了以下方法: #include <stdio.h> extern "C" { int func(int new ) { printf("in new func()\n"); } } 现在我们知道新的是C++关键字。如前所述,我们试图不对现有的C代码进行任何修改。有什么建议吗,c++,c,gcc,g++,C++,C,Gcc,G++,这些并不是唯一的错误。还有其他与结构声明相关的错误 属性c:75:错误:在“.”标记之前应该有主表达式 在attr.c,第75行为 静态post_op_attr error_attr={.attributes_follow=FALSE} 问题是代码中还有其他C风格的结构声明和初始化,所以即使我们重命名变量名,我们仍然必须修改C程序的其他部分。因此,我们正在寻找一种方法来在不修改现有C代码的情况下向C代码添加C++函数调用。p> new是一个关键字,因此不能调用变量new。但即使你可以,我也不确定

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

属性c:75:错误:在“.”标记之前应该有主表达式

在attr.c,第75行为


静态post_op_attr error_attr={.attributes_follow=FALSE}

问题是代码中还有其他C风格的结构声明和初始化,所以即使我们重命名变量名,我们仍然必须修改C程序的其他部分。因此,我们正在寻找一种方法来在不修改现有C代码的情况下向C代码添加C++函数调用。p> new是一个关键字,因此不能调用变量new。但即使你可以,我也不确定你为什么会这样做,因为它非常难阅读

即使你使用的是外部C,你仍然在用G++编译C++编译器,它会抱怨这个问题。 <>基本上,C代码在C++中不能一直运行,因为C++引入了一些关键字。这是一个你不得不改变现有代码C代码以使其编译为C++代码的时间之一。

< P>新是关键字,如果不想修改代码,不要使用G++。 改用gcc


注意:如果是C代码,它就不应该包含ExtC,如果是C++代码,它就不应该使用新的变量。C++的标识符规则是:

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

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

3.Key words cannot be used as a name.
4.大写字母和小写字母是不同的

5.不允许使用特殊字符

6.全局标识符不能用作“标识符”

<>编辑:关于你需要从C代码调用C++函数,不修改C代码,

一种方法是在C中围绕C++代码编写包装器,然后用GCC编译,不容易直接调用G++的C代码,如这里所讨论的:

此外,您可能希望看到以下内容:

而且


每种计算机语言都有一些保留关键字,它们不允许用作变量名。下面是c语言保留关键字的列表,您不应将其用作变量名

<> P>一个更多的事情,因为你正在编译一个C++编译器,所以你也应该避免使用C++保留关键字这里是一个C++关键词的链接 使用其他内容更改新内容,如使用num或其他任何内容更改新内容

< P>正如你所说的新是C++关键字,所以不能用作变量名。 <>如果你的C代码调用C++函数,那么你应该真正地认为它不是C和C,而是C++。如果你想让它变成习惯性C++,那么只需要替换一些被严重命名的变量。 但是,如果您希望对C代码库进行最小的更改,可以尝试以下方法:

#define new new__ 

<>但是,我真的不建议把它作为一个长期的修复。

< P> C和C++是不同的语言,所以用C++编译器编译C代码没有什么意义。 <>但是你不需要,人们每天都在不同的编译单元中组合C和C++。只需创建一个公共头文件toto.h,它将包含在这两个文件中。在C++中为C和C++可见的外部C子句中的所有函数都有。
#ifdef __cplusplus
extern "C" {
#endif

   // your function declarations (not definitions) go here

#ifdef __cplusplus
}
#endif
现在,您可以在单独的编译单元.c文件中实现您的函数。这些函数可以毫无问题地相互调用。

从您的

extern C做什么 ExternC不会将该代码视为C代码,它只是一个链接选项

查看有关其含义的更多信息。为了简化它,它改变了函数名在二进制文件C++编译器Mangle中的存储函数——因为函数重载:名称相同,但参数不同。只有当你将C库链接到C++模块,或者当你从C++模块导出C接口时,你才需要它。

C和C++编译器

因为你使用C++编译器G++是C++ GCC前端,迷惑了吗?看一下这个帖子,你的文件将被编译为C++代码,你不能使用C++关键字作为./p>。 解决方案

编译C源文件,假设不能简单地调用GCC C前端使用G+C++前端,必须使用-STD= C99参见C99 GCC支持。

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

对不起,现在明白了,如果我们不使用C++编译器
E不能在现有的C代码中使用C++函数。@ USER 1414360:这是因为C是一种不同于C++的语言。如果你想把C转换成C++,那么现在是修复变量名的时候了。@ USER 1414360,我想你根本不想改变现有的C代码。如果你正在改变它,以添加一些调用C++函数,只要改变名字。答案就是改变旧的C代码,在它里面没有任何C++关键字。恐怕你真的没有别的选择了。如果你不想对C代码做任何修改,为什么不把它编译成C呢?从C++中,你只需要调用你需要调用的函数的外部C声明。为了阐明查尔斯的观点,注意在C++程序中的声明中,你不需要给参数一个名称。@ BBOTFISH也不需要在C中使用OP:用C++编译C代码时的错误,这是一个错误。C代码只应该编译成C编译器,而G++不是,因为它是C++编译器。@ H2CO3Trtrue,但是我试图指出,在你声明它的C++代码中,你不需要给它一个名字。在定义中,名称是必需的,但这是可以的,因为它将在C代码中。虽然定义可能在大多数编译器上工作,但从标准C++的观点来看,这是非法的。所以,如果你使用这个,你就不再编写C++了,尽管它可能会工作。静态PysPopPoTraceReRoRyTrace= {。错误是:attr.c:75:error:expected primary expression在“.”标记之前。问题是代码中还有其他c样式的结构声明和初始化,因此即使我们重命名变量名,我们仍然必须修改c的其他部分program@user3114360那是另一个问题。这些新的C99结构初始化器不会很好地与C++进行交互。@ Rordy,如果有C++的标准库,如果正确地理解了,那么是否存在与之相关的编译器标志,或者其他任何解决方案??静态post_op_attr error_attr={.attributes_follow=FALSE};错误是:attr.c:75:error:expected primary expression before.”标记问题是代码中还有其他c样式的结构声明和初始化,因此即使重命名变量名,我们仍必须修改c程序的其他部分static post_op_attr error_attr={.attributes_follow=FALSE};错误是:attr.c:75:error:expected primary expression在“.”标记之前。问题是代码中还有其他c样式的结构声明和初始化,因此即使我们重命名变量名,我们仍必须修改c的其他部分program@Raheel:的确如此。再多的魔法也不能使C99程序变成into C++11。这两种语言在90年代早期出现了分歧。如今它们大多是链接兼容的。
g++ -c -std=c99 hello.c -o hello