1

.cpp と .h があるコード ベースがあり、gcc でビルドするように設定されています。

私の理解では、gcc は適切なファイルに適切なコンパイラを選択するので、.h ファイルは c としてコンパイルされ、.cpp ファイルは C++ としてコンパイルされると信じています (そして、テストの結果、ほぼ 100% 確信が持てました)。

g++ に変更しようとしたことがありますが、大量のエラーが発生しました。.hpp を使用しようとすると、同じことが当てはまります。

したがって、この問題を回避するために、ほとんどの場合、必要に応じて extern C++ を使用します (マップを含める場合など)。

ただし、名前空間については正しく理解できないようです。名前空間が .h としてコンパイルされているため、コンパイラが名前空間について不平を言っていると思いますか? これは正しいです。私の現在のコードは次のようになります(externなしで試した後):

foo.hで

 extern "C++" {
 namespace Caching_Logic
 {
      class foo
      {
         ....
      }
 }
 }

bar.h で

 extern "C++" {
       using namespace Caching_Logic; //completely defeats the point of namespaces
 }
 class bar
 {
   ....

          foo m_foo;

   ...
 }

両方のファイルが .cpp ファイルに含まれています

コンパイル時のエラーは次のとおりです。

filethatusesbar.cpp: エラー: 'class bar' には 'm_foo' という名前のメンバーがありません</p>

bar.h : エラー: 'Caching_Logic' は名前空間名ではありません

bar.h : エラー: ';' の前に名前空間名が必要です トークン

私は名前空間を完全に放棄することを検討していますが、コードの範囲をこれに合わせたいと思っています!

- - -アップデート - - -

http://www.network-theory.co.uk/docs/gccintro/gccintro_54.htmlを読んだ後

gcc の機能について少し理解が深まりました。もともと私は、必要に応じてgccがC ++でコンパイルし、.cに遭遇したときにCでコンパイルすることをどこかで読みました

これは本当ですが、リンカーに問題があるようです。これはライブラリとしてコンパイルされているため、以前に問題を見たことがないことは理にかなっています。これは私のスコープの問題、外部リンケージに関連していると思いますか?

4

1 に答える 1

1

.h ファイルは C としてコンパイルされません。それらは *.cpp ファイルに含まれ、前処理された組み合わせは C++ コンパイラによってコンパイルされます。

bar.h の問題行の前に #include foo.h があることを確認します。そうしないと、コンパイラ エラーが発生する可能性があります。自身の物理的な依存関係を最もよく知っている bar.h に #include することをお勧めします。

コメントで指摘されているように、bar.h の using ディレクティブは有害と見なされます。代わりにこれを使用することを検討してください。

class bar {
    ....
    Caching_Logic::foo m_foo;
于 2013-04-29T17:12:50.163 に答える