1

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

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

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

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

4

3 回答 3

12

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

C++ 不支持此语法。

在所有文件上运行g++还是仅在 cc 文件上运行?

参见例如从 GCC 文档编译 C++ 程序:

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

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

所以有两种可能:

  1. gcc在 C 文件和g++C++ 文件上运行。
  2. gcc在所有文件上运行。

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

于 2012-06-23T23:41:00.273 回答
5

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

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

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

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

于 2012-06-23T23:45:07.590 回答
2

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

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

于 2012-06-24T00:43:28.020 回答