在.cpp和.h中包含标题的区别

时间:2012-10-30 00:58:19

标签: c++ include

我有一个代码,我#include<linux/videodev2.h>。有三个文件:

  1. 一个标头文件 - 包括:stdint.hstdlib.h。定义了几个函数,一个结构,比如abc和一些#define宏。其中一个功能是

    int func(int, uint32_t, size_t, abc*);
    
  2. 一个包含很多方法的cpp文件,包括.h文件中函数的定义。

  3. 一个main.cpp,它有main(),它对.h文件中的方法有一个函数调用(下面的完整文件)。此文件仅用于测试目的。

    #include "head.h"
    int main() {
        func(5, (uint32_t)5, (size_t)5, 0);
        return 0;
    }
    
  4. 看到的是一个奇怪的案例:

    1. 如果我仅在.h文件中包含linux/videodev2.h,则{c}文件无法访问此标头中定义的其他内容uint32_t。 (我得到的错误是:uint32_t was not declared in this scopeuint32_t does not name a type等等。即使.h文件的第一行是#include<linux/videodev2.h>
    2. ,也会发生这种情况
    3. 如果我在两个cpp文件中都包含videodev2标头,如果我在.h文件之前导入它(videodev2),它只能
    4. 如果我在main.cpp文件中使用func(5, (uint32_t)5, (size_t)5, (abc*)0);,我会收到在此范围内未声明abc的错误。
    5. 我正在使用命令编译:{{1​​}}

      我无法弄清楚为什么会这样。我想在.h文件中包含videodev2标头,因为几乎可以肯定使用.h文件的代码将依赖于它。但似乎将它包含在.h文件中根本没有任何效果。

      我必须诚实。这是我必须转换为C ++的C代码。我知道我不符合最佳做法和标准。但为什么会出现这种行为?

2 个答案:

答案 0 :(得分:3)

请记住,#include指令指示预处理器应将指定文件的内容视为直接出现在源文件中而不是指令(从MSDN转述)。< / p>

考虑到这一点,您似乎遇到了#include s的不正确顺序,也缺少#include s。我的猜测是你没有在.cpp文件中包含你自己的头文件。这将解释案例一和三。请考虑以下文件:

// 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是not exactly desirable;最好避免在头文件中使用#include,因为它们会增加构建时间并创建不需要的依赖项。但是,它将确保header.h所需的类型可供其使用。关键是 linux/videodev2.h的内容必须出现在header.h的内容之前,header.h#include d。

这将我带到选项2.选项2也将正确编译,因为linux/videodev2.h包含在标题之前,并且您的标头依赖于其中定义的类型。同样重要的是,main.cppheader.cpp都必须#include "header.h",因为它们引用了在其中声明的符号。

如果您使用选项3,您将收到未定义类型uint32_t的编译错误,编译器将指向您的头文件。这是因为头文件的内容出现在linux/videodev2.h的内容之前,因此编译器在遇到它时不知道类型uint32_t是什么。

所以,考虑到所有这些,您可以选择:在每个包含您自己的头文件之前包含`linux / videodev2.h',或者直接将其包含在头文件中。我之前提到过后者不是很好的做法,但对于你的特殊情况,它可能是两者中更好的选择,以防你的头文件需要包含在许多.cpps中。

我认为这是一个潜入precompiled headers的好机会,但我对它们并不熟悉,所以我会留给那些有更多经验来解释它们的人。

希望这有帮助:)

答案 1 :(得分:0)

找到答案。目录中有.h.gch文件。我不知道预编译的头文件。感谢ktodisco的洞察力。我仍然不知道为什么那个文件首先出现在那里。