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

时间:2013-12-18 08:40:43

标签: c++ c gcc g++

我们正在尝试修改一些现有的C项目,即我们正在尝试从C代码进行一些C ++函数调用。我们尝试将编译器从gcc更改为g ++,但由于不兼容性,存在多个编译错误。我们要做的是在C代码中调用一些C ++函数,而不对现有代码进行任何更改。简单地改变编译器似乎没有做到这一点。因此我们尝试了以下内容:

#include <stdio.h>

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

当我使用命令

编译它时
  

g ++ -c hello.c -o hello

我们收到以下错误

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

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

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

  

attr.c:75:错误:在'。'标记

之前预期的primary-expression

在attr.c,第75行是

  

static post_op_attr error_attr = {.attributes_follow = FALSE};

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

7 个答案:

答案 0 :(得分:7)

new是一个关键字,因此您无法调用变量new。但即使你可以,我也不确定你为什么会这样,因为它难以理解。

即使您正在使用extern "C",您仍在使用g++进行编译,这是c ++编译器,它会抱怨这一点。

基本上C代码不能总是在c ++中保持不变,因为c ++引入了一些关键字。这是其中一个时间,你别无选择,只能更改一些现有的代码C代码,使其编译为c ++代码。

答案 1 :(得分:3)

正如您所说new是C ++关键字,因此不能用作变量名。

如果您的C代码正在调用C ++函数,那么您应该认为它不是C和更多,而是C ++。这将意味着更多(如果你想让它成为惯用的C ++,那就更多了),然后只是替换一些命名不好的变量。

但是,如果您打算对C代码库进行最小的更改,那么可以试试这个hack:

#define new new__ 

但是,我确实不建议将其作为长期修复。

答案 2 :(得分:1)

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

注意:如果它是c代码,它永远不应该包含extern "C",如果它是c ++代码,它绝不应该使用new作为变量。

答案 3 :(得分:1)

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

1.仅允许使用字母,数字和下划线。

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

3.Key words cannot be used as a name.

4.上个案和小写字母是截然不同的。

5.不允许使用特殊字符

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

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

一种方法是在C语言中编写C ++代码的包装器然后用gcc编译,直接从g ++调用c代码并不容易,如下所述:

How to call C++ function from 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

答案 4 :(得分:0)

每种计算机语言都有一些保留关键字,它不允许用作变量名。以下是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

答案 5 :(得分:0)

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

但是你不需要,人们会在日常基础上将C和C ++结合在不同的编译单元中。只需创建一个包含在两者中的公共头文件toto.h即可。将所有函数放在extern "C"子句中,使C对C不可见,对C ++可见。

#ifdef __cplusplus
extern "C" {
#endif

   // your function declarations (not definitions) go here

#ifdef __cplusplus
}
#endif

现在,您可以在单独的编译单元(.c文件)中实现您的功能。而这些功能可以毫无问题地相互呼叫。

答案 6 :(得分:0)

deleted question迁移。

extern“C”是什么

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

检查this post here on SO以获取有关其含义的更多信息。为了使它简短(和简单),它改变了函数名称存储在二进制文件中的方式(C ++编译器mangles - decorate - 函数名称,因为函数重载:名称相同但参数不同)。只有在将C库链接到C ++模块时(或者从C ++模块导出C接口时)才需要它。

C和C ++编译器

因为您正在使用C ++编译器(g ++是C ++ GCC前端,很困惑?看看这篇关于what's difference between gcc and g++的帖子)您的文件将被编译为C ++代码而您不能使用C ++关键字(发布在this answer)。

解决方案

要使用gcc C ++前端编译C源文件(假设您不能简单地调用g++ C前端),您必须使用-std=c99(请参阅this documentation了解C99海湾合作委员会支持)。

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