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++函数调用的方法。
即使你使用的是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
注意:如果是C代码,它就不应该包含EDCOX1×2,如果它是C++代码,它就永远不应该使用EDCOX1×0作为变量。
已从已删除的问题中迁移。
外部"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++结合在不同的编译单元中。只需创建一个通用头文件
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。
用其他东西改变