我们正在尝试修改一些现有的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 ++函数调用。
答案 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
以及
答案 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"
不会将该代码视为C代码,它只是一个链接选项。
检查this post here on SO以获取有关其含义的更多信息。为了使它简短(和简单),它改变了函数名称存储在二进制文件中的方式(C ++编译器mangles - decorate - 函数名称,因为函数重载:名称相同但参数不同)。只有在将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