编译使用旧样式函数定义的c文件时,如
int foo(a)
int a;
{
...
}
g ++将给出错误:'a'未在此范围内声明。 gcc可以解析这个。 有没有办法让g ++认识到这一点?
这对我来说是一个问题,因为我正在编译c和c ++文件的混合。 一个相关的问题是什么是标准做法 建造这种混合源?在所有文件或仅cc文件上运行g ++?前者很方便但是由于c和c ++规范之间的不一致而不断给我带来麻烦(例如,char [4] =“four”;)
答案 0 :(得分:11)
有没有办法让
g++
认出这个?
C ++不支持此语法。
在所有文件或仅cc文件上运行
g++
?
参见例如来自海湾合作委员会文件的Compiling C++ programs:
C ++源文件通常使用后缀.C',。cc,。cpp,.CPP,.c ++,。cc或.cxx; C ++头文件通常使用.hh,.hpp,.H或(对于共享模板代码).tcc;和预处理的C ++文件使用后缀.ii。 GCC识别具有这些名称的文件并将它们编译为C ++程序,即使您以与编译C程序相同的方式调用编译器(通常使用名称
gcc
)。但是,使用
gcc
不会添加C ++库。g++
是一个调用GCC并将.c,.h和.i文件视为C ++源文件而不是C源文件的程序,除非使用-x
,并自动指定与C ++库的链接。当预编译带有.h扩展名的C头文件以用于C ++编译时,此程序也很有用。
两种可能性:
gcc
,在C ++文件上运行g++
。gcc
。在这两种情况下,您都需要与g++
(或gcc -lstdc++
)相关联。
答案 1 :(得分:4)
Oli是正确的:C ++不支持旧式函数定义。
使用C编译器(例如gcc)编译C.
使用C ++编译器(例如g ++)编译C ++。
它们是两种不同的(虽然密切相关)语言。您可以使用C ++的extern "C"
功能从C ++调用C代码,反之亦然;有关详细信息,请参阅C++ FAQ Lite的第32节。
答案 2 :(得分:2)
如果要编译C和C ++,最好总是使用gcc
编译(它将选择基于文件扩展名的语言)而不是g++
(总是编译为C ++) )。您需要更改链接器选项以包含C ++标准库(如果您使用它,则为-lm
),因为这些选项由g++
而不是gcc
自动添加。
或者,更好的选择是为C ++调用g++
,为C文件调用gcc
。通过配置构建系统,这不应该太难管理。