0

私は私がいるコードを持っています#include<linux/videodev2.h>。3つのファイルがあります:

  1. 1つのヘッダーファイル-インクルード:stdint.hおよびstdlib.h。いくつかの関数、構造体、たとえばabc、およびいくつかの#defineマクロを定義します。機能の1つは

    int func(int, uint32_t, size_t, abc*);
    
  2. .hファイル内の関数の定義を含む多くのメソッドを含む1つのcppファイル。

  3. .hファイル(以下の完全なファイル)のメソッドへの関数呼び出しを持つmain()を持つ1つのmain.cpp。このファイルはテストのみを目的としています。

    #include "head.h"
    int main() {
        func(5, (uint32_t)5, (size_t)5, 0);
        return 0;
    }
    

見られるのは奇妙なケースです:

  1. linux/videodev2.h.hファイルのみにインクルードuint32_tし、このヘッダーで定義されている他のものに.cppファイルからアクセスできない場合。(私が得るエラーは:、、、uint32_t was not declared in this scopeなどuint32_t does not name a typeです)。これは、.hファイルの最初の行が#include<linux/videodev2.h>
  2. 両方のcppファイルにvideodev2ヘッダーを含めると、.hファイルの前にそれ(videodev2)をインポートした場合にのみ機能します。
  3. main.cppファイルで使用するfunc(5, (uint32_t)5, (size_t)5, (abc*)0);と、このスコープでabcが宣言されていないというエラーが表示されます。

次のコマンドを使用してコンパイルしています。g++ main.cpp head.cpp

これがなぜなのか理解できません。.hファイルを使用するコードがそれに依存することはほぼ確実なので、videodev2ヘッダーを.hファイルに含めたいと思います。しかし、それを.hファイルに含めてもまったく効果がないようです。

私はここで正直でなければなりません。これは私がC++に変換しなければならなかったCコードでした。私はベストプラクティスと基準に準拠していないことを知っています。しかし、なぜこの動作が見られるのですか?

4

2 に答える 2

3

ディレクティブ#includeは、指定されたファイルの内容を、ディレクティブの代わりにソースファイルに直接表示されているかのように処理する必要があることをプリプロセッサに示していることに注意してください(MSDNから言い換えます)。

そのことを念頭に置いて、sの順序が正しくなく、 #includesが欠落しているようです#include。私の推測では、.cppファイルに独自のヘッダーファイルを含めていません。これはケース1と3を説明します。次のファイルを検討してください。

// header.h
// #include <linux/videodev2.h>  <-- Option 1
class A {
    void func(uint32_t var);
};

// header.cpp
void A::func(uint32_t var) {
    // implementation
}

// main.cpp
// #include <linux/videodev2.h>  <-- Option 2
#include "header.h"
// #include <linux/videodev2.h>  <-- Option 3

int main() {
    // implementation; something creates an instance of A and calls func
}

現在、オプション1は必ずしも望ましいものではありません。#includeヘッダーファイルでsを使用しないことをお勧めします。これは、ビルド時間が長くなり、不要な依存関係が作成される可能性があるためです。header.hただし、使用するために必要なタイプが確実に存在するようになります。重要な点は、 dのどこでも、の内容がの内容linux/videodev2.hの前に表示される必要があるということです。header.hheader.h#include

これにより、オプション2が表示されます。オプション2も正しくコンパイルlinux/videodev2.hされます。これは、ヘッダーの前に含まれており、ヘッダーはその中で定義されている型に依存しているためです。また、その中で宣言されているシンボルを参照するため、main.cppとの両方がheader.cpp必要であるということも重要です。#include "header.h"

オプション3を使用すると、型uint32_tが定義されていないというコンパイルエラーが発生し、コンパイラーはヘッダーファイルをポイントします。これは、ヘッダーファイルの内容がの内容の前に表示されるため、コンパイラーは、ヘッダーファイルに遭遇したときにlinux/videodev2.hタイプが何であるかをまだ理解していないためです。uint32_t

したがって、これらすべてを考慮すると、選択肢があります。独自のヘッダーファイルをインクルードする前に `linux / videodev2.h'をインクルードするか、ヘッダーファイルに直接インクルードします。後者は良い習慣ではないことを先に述べましたが、特定のケースでは、ヘッダーファイルを多くの.cppsにインクルードする必要がある場合に備えて、2つのオプションの方が適している可能性があります。

これはプリコンパイル済みヘッダーに飛び込む良い機会だと思いますが、私はそれらに精通していないので、より経験のある人に説明を任せたいと思います。

お役に立てれば :)

于 2012-10-30T03:22:35.207 に答える
0

答えが見つかりました。ディレクトリに.h.gchファイルがありました。プリコンパイル済みヘッダーについて知りませんでした。洞察を与えてくれたktodiscoに感謝します。そもそもなぜそのファイルがあったのか、私にはまだわかりません。

于 2012-10-30T04:02:07.180 に答える