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プログラムのコンパイルと同じ方法(通常は名前gcc)でコンパイラーを呼び出した場合でも、C++プログラムとしてコンパイルします。

ただし、を使用gccしてもC++ライブラリは追加されません。g++は、GCCを呼び出し、.c、.h、および.iファイルを-x使用されない限りCソースファイルではなくC ++ソースファイルとして扱い、C++ライブラリに対するリンクを自動的に指定するプログラムです。このプログラムは、C++コンパイルで使用するために拡張子が.hのCヘッダーファイルをプリコンパイルする場合にも役立ちます。

したがって、2つの可能性:

  1. gccCファイルおよびg++C++ファイルで実行します。
  2. すべてのファイルで実行gccします。

どちらの場合も、g++(またはgcc -lstdc++)とリンクする必要があります。

于 2012-06-23T23:41:00.273 に答える
5

Oliは正しいです:C++は古いスタイルの関数定義をサポートしていません。

CをCコンパイラ(gccなど)でコンパイルします。

C++コンパイラ(g ++など)を使用してC++をコンパイルします。

それらは2つの異なる(密接に関連しているが)言語です。C ++のextern "C"機能を使用して、C++からCコードを呼び出すことができます。その逆も可能です。詳細については、 C ++FAQLiteのセクション32を参照してください。

于 2012-06-23T23:45:07.590 に答える
2

CとC++の両方をコンパイルする場合は、 (常にC ++としてコンパイルするgcc)よりも(ファイル拡張子に基づいて言語を選択する)を使用してコンパイルする方が適切g++です。リンカーオプションを変更して、C ++標準ライブラリ(および-lmそれを使用する場合)を含める必要があります。これらはによって自動的に追加されますg++が、ではありませんgcc

g++または、 C++およびgccCファイル用にを呼び出すことをお勧めします。ビルドシステムを構成することによって、それを管理するのはそれほど難しいことではありません。

于 2012-06-24T00:43:28.020 に答える