0

CおよびC++のプリプロセッサディレクティブについて質問があります。

私は次のコードを持っています:

#ifdef __cplusplus
//part A
extern "C" 
{
// somecode here
}
#else
//part B
#endif

私は、c++コンパイラーが事前定義された__cpluspluswillcコンパイラーがそうではないことを知っています。

そして、このコードセットをacヘッダーファイルに入れます。c++ファイルにはこのcヘッダーファイルが含まれます。そして私の質問は、ファイルがc ++コンパイラでコンパイルされている場合は、パートAをコンパイルし、acコンパイラでコンパイルされている場合は、パートBをコンパイルしますが、通常、このコードを使用してc++ファイルを作成します。 cファイルは相互に作用します。上記のようなコードがある場合、CファイルとC ++ファイルの両方が一緒にあり、gccコンパイラを使用しているということですが、このコードはどのようにコンパイルされますか?パートAだけがコンパイルされますか?またはパートBのみがコンパイルされますか?または、コードが2つの部分に分割され、パートAがC ++用にコンパイルされ、パートBがCファイル用に同時にコンパイルされますか?

4

5 に答える 5

2

上記のようなコードがある場合、CファイルとC ++ファイルの両方が一緒にあり、gccコンパイラを使用しているということですが、このコードはどのようにコンパイルされますか?パートAだけがコンパイルされますか?またはパートBのみがコンパイルされますか?

これは、ヘッダーを含む#includesトランスレーションユニットがどのようにコンパイルされているかによって異なります。C ++としてコンパイルされている場合は、パートAが有効になります。Cとしてコンパイルされている場合は、パートBになります。

を使用gccすると、言語はファイル拡張子によって決定されるか、コマンドラインで明示的に指定できます。

-x language

次の入力ファイルの言語を明示的に指定します(ファイル名のサフィックスに基づいてコンパイラーにデフォルトを選択させるのではなく)。このオプションは、次のオプションまで、後続のすべての入力ファイルに適用され-xます。

言語に使用できる値は次のとおりです。cc-headerc-cpp-outputc ++ c ++-header c++-cpp-outputobjective-cobjective-c-headerobjective-c-cpp-outputobjective-c ++objective-c ++-headerobjective-c ++ -cpp-出力アセンブラアセンブラ-with-cppadaf77 f77-cpp-input f95 f95-cpp-input java

于 2012-12-04T20:27:31.027 に答える
2

直接的な答え:現在のコンパイラ呼び出しに適切な部分のみがコンパイルされます。

通常、構造は次のとおりです。

#ifdef __cplusplus
extern "C" {
#endif
/* Definitions here */
#ifdef __cplusplus
}
#endif

ヘッダーファイル内。したがって、両方の言語で互換性のある定義を取得できます。その場合、実装ファイルは純粋なCになり、.cファイルに保存されます。

于 2012-12-04T20:30:46.323 に答える
0

概念的には、C++は識別子を操作することによってCコードに変換されます。これはリンクに影響します。(実際、これは過去に行われた方法であり、メモリが私に正しく役立つ場合、それはCFrontによって行われました。

だから持っている

#ifdef __cplusplus
   extern "C" {
#endif
   /* Definitions here */
#ifdef __cplusplus
}
#endif

CとC++の両方で同じ定義があります。それはばかげているので、あなたは別のもの(あなたの質問のパートAとB)を望んでいません。CとC++で使用する場合も、まったく同じです。

このextern "C"ビットは、リンクがC用にコンパイルされたオブジェクトコード用であることを確認するようにC ++コンパイラに指示します。したがって、C ++マジックを実行せず、リンクが機能することを確認します。

于 2012-12-04T20:37:44.540 に答える
0

デフォルトでは、gccは、、、およびその他のいくつかの拡張機能をC ++およびCとして認識.C.cppます.cc。make.cファイルでよりファンキーなものを試して、それぞれの方法で強制的に実行できますが、単純なケースでは、これは単純です。

于 2012-12-04T20:28:03.977 に答える
0

複数のソースファイルがあるプロジェクトでは、ヘッダーはコンパイラによって1回だけ処理されません。

コンパイラーは、C ++ファイルをコンパイルするときに、そのファイルとそれに含まれるヘッダーを(直接的または間接的に)読み取り、C++のルールを使用してそれらのファイルの内容を処理します。

コンパイラーはCファイルをコンパイルするときに、そのファイルとそれに含まれるヘッダーを(直接的または間接的に)読み取り、Cのルールを使用してそれらのファイルの内容を処理します。

結果は、ヘッダーファイルのコードがC++ソースとCソースに別々に表示されているかのようになります。

于 2012-12-04T20:53:49.443 に答える