3

C C++ コードが混在しています。すべて g++ でコンパイルされています。Cヘッダーがあるところはどこでも、ヘッダーファイルの内容が内部に含まれています

#if defined(__cplusplus)
extern "C" {
#endif

#if defined(__cplusplus)
    extern "C" {
    #endif

しかし、ある C ヘッダー ファイルで、パラメーター名を template として誤って使用した g++ コンパイル エラーが発生しました。これは明らかに正しくなく、c++ キーワードtemplateと競合しています。

このパラメーター名を変更できることはわかっていますが、このextern "C"宣言が機能しない理由と、ヘッダー ファイルが意図した C ではなく C++ コードと見なされる理由を考えています。

g++ バージョン 4.1.1 Linux Red Hat Enterprise。

4

2 に答える 2

5

extern "C"のみがコンパイラに伝えます(実際には、リンカー)その C++ 名マングリングは、そのスコープで宣言された関数には適用されません。構文やキーワード自体とは関係ありません。

最善の解決策は、競合するシンボルの名前を変更することです。

于 2012-06-12T10:36:02.840 に答える
4

検討:

extern "C" {
  namespace n
  {
    int& foo(bool b)
    {
      if (!b)
        throw std::invalid_argument("fail!");
      static int i = 0;
      return ++i;
    }
  }
}

この関数には C 言語のリンケージがありますが、参照、名前空間、および例外を使用しています。これextern "C"により、コンパイラが C のコンパイルに魔法のように切り替わることはなく、関数に対して C の呼び出し規則とシンボル命名規則を使用するようにコンパイラに指示するだけです。 C 言語リンケージを持つ変数 (これは通常、名前マングリングを無効にし、異なる名前空間で一致する宣言が同じエンティティを参照するようにすることを意味します)。

于 2012-06-12T12:47:52.370 に答える