2017-09-12 14 views
2

現在OpenCVについて調べています。ライブラリのソースファイルにヘッダが含まれていないのはなぜですか?

Matクラスを検索すると、インクルードフォルダにあるmat.hppで定義されていることがわかります。しかし、対応するmat.cppを検索しようとすると、クラス定義が実際にmatrix.cppにあることがわかりました。私は、ファイル名の違いは、それが含まれている限り、問題ではないと仮定mat.hpp。ただし、ヘッダmat.hppも含まれていませんでした。私はコンパイラがおそらくまだコンパイルできることを知っていますが、私が知る限り、これはプログラミングの面で悪いことです。

私の質問は、ヘッダーファイルをソースファイルに含めないことは悪い習慣だということですか?それが含まれてはならない理由はありますか?

私は、ライブラリの詳細な実装についてはあまり詳しく調べる必要はないことを理解していますが、この質問は好奇心からは逸れています。ここで

matrix.cpp

#include "precomp.hpp" 
#include "opencl_kernels_core.hpp" 
#include "bufferpool.impl.hpp" 

#include一部であり、ここでの短い答えはmat.hpp

#include "opencv2/core/matx.hpp" 
#include "opencv2/core/types.hpp" 
#include "opencv2/core/bufferpool.hpp" 
+0

最初は "mat"クラスは 'mat.hpp'で定義されていると言っています。"その直後、「クラス*の定義が実際には 'matrix.cpp'にあることが分かりました。これは自己矛盾しているようです。ここでも、クラス定義*はどこにありますか? – AnT

+0

申し訳ありませんが、私はここで間違った言葉を使いました。 Matはと宣言されています mat.hppで定義されていません –

答えて

3

#include一部です:それは、プロジェクトがどのように進化したかです。

OpenCVは多くの機能とクラスをcore.hppに宣言していますが、多くのファイルには実装が含まれています。.cppこの場合、行列固有の関数(およびMatの実装)はmatrix.cppになり、クラスの定義はMatのようにcore.hppになります。

プロジェクトが成長するにつれて、物事が分裂しているように思えます(おそらく管理しやすくなる)。 thisコミットでは、クラスMatcore.hppからmat.hpp(おそらくクラス名と一致する名前)に移動されました。ソースファイルmatrix.cppにはmat.hppが含まれていますが、間接的には(precomp.hppcore.hppまで)です。

私はこの混乱が故意ではなく、意図的なものだとは思わない。これは悪い習慣ですか?何人かはそれを言うでしょうが、決定するのはあなた次第です。

免責事項:私はOpenCVのソースに働いていないが、時間のために広く、それを使用しました。 C++で

+0

あなたの答えをありがとう。しかし、なぜ彼らはここに間接的に包含されているのですか?単に「mat.hpp」を直接組み込むのはなぜですか? –

3

もしヘッダファイルでクラスを定義し、.cppファイル内のクラスメンバ(メソッドなど)を定義する場合、クラス定義は、その.cppファイルに見えるようになっています。これは、通常、メンバーを定義するファイル.cppにクラス定義のヘッダーファイルを含めることで実現されます。 OpenCVのmat.hpp

は間接的matrix.cppに含まれています。 matrix.cppprecomp.hppを含み、を含み、順にmat.hppを含む。

matrix.cppにはmat.hppが実際に含まれています。ここには珍しいものはありません。

P.S.ファイル名は何の役割も果たしません。 mat.hppに「」という名前が「違う」という珍しいことはありません。

+0

あなたの答えをありがとう。しかし、なぜ彼らはここに間接的に包含されているのですか?単に「mat.hpp」を直接組み込むのはなぜですか? –

+1

@Le Hoang Long:中間ヘッダーの名前である 'precomp.hpp'は、ヘッダーのプリコンパイルの目的でそれを行うことを明確に示唆しています。明らかに、広く使われているヘッダーはすべてprecomp.hppで事前にコンパイルされていると考えられます。 – AnT

+0

ああ、そうです。ヘッダーファイルを管理する方が簡単になるように、precomp.hppをインクルードするだけです –

関連する問題