使用g ++编译K& R样式函数定义

时间:2012-06-23 23:39:29

标签: c++ c kernighan-and-ritchie

编译使用旧样式函数定义的c文件时,如

int foo(a)
   int a;
{
  ...
}

g ++将给出错误:'a'未在此范围内声明。 gcc可以解析这个。 有没有办法让g ++认识到这一点?

这对我来说是一个问题,因为我正在编译c和c ++文件的混合。 一个相关的问题是什么是标准做法 建造这种混合源?在所有文件或仅cc文件上运行g ++?前者很方便但是由于c和c ++规范之间的不一致而不断给我带来麻烦(例如,char [4] =“four”;)

3 个答案:

答案 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 ++编译时,此程序也很有用。

两种可能性:

  1. 在C文件上运行gcc,在C ++文件上运行g++
  2. 对所有文件运行gcc
  3. 在这两种情况下,您都需要与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。通过配置构建系统,这不应该太难管理。