gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:26 26 4
gpt4 key购买 nike

所以我正在尝试学习一些 C,因为下学期我可能需要它,而且我在使用预编译头文件的 Visual C++ 中遇到了一个小问题:

我在 header1.h 中做了类似的事情:

typedef struct {
int example;
} randstruct;

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

#include "header1.h"

然后我在 ma​​in.c 中执行此操作:

#include "header2.h"

int main()
{
randstruct *s;
}

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

PS:我假设有人会告诉我这是不好的做法或其他什么,那可能是,但这仍然让我好奇。此外,VC++ 中标准生成的预编译 header 包含一个 #include 并且出于某种原因我可以正常使用像 FILE 这样的 typedef,尽管它是在包含在预编译头文件又包含在我的主 c 文件中。

最佳答案

原来我没有正确理解预编译头文件的概念。基本上,预编译头文件只编译一次。不是每次构建一次,而是每次创建时只一次(我想主要是在项目创建时)。这是因为对于大型项目,头文件编译/预处理可能需要很长时间,如果您有一个几乎从未更改过的大头文件,最好将其用作预编译头文件。

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

只需前往项目 -> 属性 -> 配置属性 -> C/C++ -> 预编译 header

  1. 如果您希望每次构建时都重新创建预编译 header (不推荐,尤其是对于大型项目,但对于小型测试项目可能有用),请选择Create (/Yc)。。
  2. 否则,您可以通过选择创建 (/Yc) 重新创建一次,构建它一次,然后将预编译头设置重置为 Use (/Yu)。应该还有其他方法,但这是我唯一知道的方法。

我的 typedef 没有被编译器识别的原因是因为我在定义结构并将头文件包含在预编译头的源代码之后没有重新创建预编译头文件,所以编译器继续使用旧的。

关于c - 为什么我不能使用包含在 VC++ 预编译头文件中的头文件中的 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21207394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com