K&R 风格的函数定义使用 g++ 编译

K&R style function definition compile using g++

本文关键字:g++ 编译 定义 函数 风格      更新时间:2023-10-16

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

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

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

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

有没有办法让g++认识到这一点?

C++不支持此语法。

在所有

文件上运行g++还是仅对 cc 文件运行?

例如,请参阅从 GCC 文档中编译C++程序

C++源文件通常使用其中一个后缀。C', .cc, .cpp, .CPP、.c++、.cp 或 .cxx;C++头文件通常使用 .hh、.hpp、.H,或(对于共享模板代码).tcc;预处理的C++文件使用后缀 .ii。GCC 识别具有这些名称的文件并将它们编译为C++程序,即使您调用编译器的方式与编译 C 程序的方式相同(通常名称为 gcc )。

但是,使用 gcc 不会添加C++库。 g++是一个调用GCC的程序,除非使用-x,否则将.c,.h和.i文件视为C++源文件而不是C源文件,并自动指定针对C++库的链接。在预编译扩展名为 .h 的 C 头文件以用于C++编译时,此程序也很有用。

所以有两种可能性:

  1. 对 C 文件运行gcc,对C++文件运行g++
  2. 对所有文件运行gcc

在这两种情况下,您都需要与g++(或gcc -lstdc++)链接。

Oli 是正确的:C++不支持旧式函数定义。

使用 C 编译器(如 gcc)编译 C。

使用C++编译器(如 g++)编译C++。

它们是两种不同的(尽管密切相关的)语言。 您可以使用 C++ 的 extern "C" 功能从C++调用 C 代码,反之亦然;有关详细信息,请参阅 C++ FAQ 精简版的第 32 节。

如果你要同时编译 C 和 C++,你最好总是使用 gcc 编译(它会根据文件扩展名选择语言)而不是g++(将始终编译为 C++)。您需要更改链接器选项以包含标准库(如果使用C++则-lm),因为这些选项由g++自动添加,但不是gcc

或者,更好的选择是为 C++ 调用 g++,为 C 文件调用gcc。通过配置构建系统,这应该不会太难管理。