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