为什么我不能使用VC ++中预编译头中包含的头文件中的typedef?

时间:2014-01-18 17:26:56

标签: c visual-c++ header-files

所以我正在尝试学习一些C,因为我可能需要它用于下一学期的大学,我在Visual C ++中有一些预编译标题的问题:

我在 header1.h:

中做了类似的事情
typedef struct {
    int example;
} randstruct;

然后我在 header2.h中执行此操作:

#include "header1.h"

然后我在 main.c:

中执行此操作
#include "header2.h"

int main()
{
    randstruct *s;
}

header2.h 是预编译的标头。这样做会导致程序无法识别结构并给我错误,声称randstruct和s是未声明的标识符。在预编译头之外(仅在另一个头文件中)执行此操作似乎确实有效,并且使用函数原型而不是typedef执行此操作似乎也可以正常工作。这是怎么回事?这是VC ++问题还是我误解了什么?

PS:我认为有人会告诉我这是不好的做法或其他事情,可能是这样,但这仍然让我产生了好奇心。此外,VC ++中标准生成的预编译头包含 #include ,由于某种原因,我可以正常使用类型 FILE ,尽管它在包含在头文件中的头文件中定义预编译的头文件又包含在我的主c文件中。

2 个答案:

答案 0 :(得分:1)

原来我没有正确理解预编译头的概念。基本上,预编译头只编译一次。每次构建都不会一次,但每次构建时都只需要一次(我猜主要是项目创建)。这是因为头文件编译/预处理对于大型项目来说可能需要很长时间,如果你有一个几乎没有变化的大头文件,最好将它用作预编译头。

如果更改预编译的头文件源文件并希望更改生效,则必须重新编译它,否则旧版本的头文件将继续由应用程序使用而不是更新版本。

简单地去 项目 - >属性 - >配置属性 - > C / C ++ - >预编译标题

  1. 如果您希望每次都在构建时重新创建预编译的头文件(不推荐,特别是对于大型项目,但对小型测试项目可能有用),请选择创建(/Yc).
  2. 否则,您可以选择创建(/ Yc)进行构建,然后重新创建一次 它一次,然后将预编译的标题设置重置为使用(/ Yu)。应该有其他方式,但这是我所知道的唯一方式。
  3. 编译器无法识别我的 typedef 的原因是因为我在定义结构并在预编译头的源代码中包含头文件后没有重新创建预编译的头文件,所以编译器继续使用旧版本。

答案 1 :(得分:0)

在编译器编译代码之前,先检查它。检查过程基于文本代码。编译头文件(header2.h)时,它会提供一个二进制文件,编译器无法知道包含类型randstructheader1.h)的头是否包含在该二进制文件中(预编译header2.h)。您只能使用预编译函数并包含包含这些预编译函数原型的头文件,以便您的编译器可以了解这些函数。这就是库文件总是带有头文件的原因。