1

我正在尝试编译一个未指定的软件,并且在标准头文件中出现错误,例如stdio.h. 错误大多是未声明的标识符,例如_In_. IntelliSense 发现它们的定义很好。我应该在什么大方向上寻找造成这种情况的原因?

补充:例如,在一个 cpp 文件stdio.h中包含第一个文件 - 在它之前没有我可以看到的定义。不使用预编译头文件。我安装的其他东西编译得很好。

4

7 回答 7

6

“你在做一些未指明的错误”是我能做的最好的事情。

标准库确实可以编译,我可以告诉你这么多。

因此,要么您的项目配置错误,要么您的代码中的某些内容影响了包含的文件(例如,可能是一些错误的#defines)

如果您想要更具体的答案,您必须向我们提供一些具体信息。你得到了哪些错误?文件是如何包含的?你能展示一些重现问题的最小代码吗?

于 2009-07-30T08:36:22.130 回答
2

由于 VS 喜欢使用预编译的头文件,您可能需要确保您没有违反任何假设。麻烦的来源之一是在包含stdafx.h.

即使在没有任何预编译标头问题的情况下,您也可能无意中定义了与股票标头中的定义交互不良的东西。如果您查看 stdio.h 内部,您会发现它有许多有趣的条件编译部分,因为同一个文件分发到许多不同的平台。请务必查看项目的设置,如果问题仅在编译特定源文件时发生,那么该文件的编译设置也是如此。

当然值得开始一个新项目并检查是否可以编译好的 ol' hello.c...

#include <stdio.h>
int main(int argc, char **argv) {
    printf("hello, world.\n");
    return 0;
}

如果没有,那么您的 VS 安装存在严重问题。

另一个可能但不太可能的麻烦来源是,如果您安装了其他编译​​器,并且不知何故意外地让 VSstdio.h完全使用了另一个编译器......一个不适当的 INCLUDE 环境变量曾经能够导致这种情况,但我不确定它确实如此在最近的版本中。很久以前我就被它烧死了,从那时起我就让各个编译器在全局环境中设置哪些变量更加小心。

于 2009-07-30T08:51:46.013 回答
2

可能性:

  • 使用错误的标志编译。具体来说,您的包含路径设置不正确,您正在为 C++ 而不是 C 进行编译,类似这些。
  • 您在标头前面包含的内容正在重新定义标准标头中的内容。您的问题使这听起来不太可能。
  • 您在编译器命令行上定义的东西搞砸了。
  • 您的标头不正确,错误,不打算与您的编译器版本一起使用,等等。
  • 您的编译器不正确、错误、不符合标准等。

最好的诊断是转储预处理的源。每个编译器都有一个选项。我相信它是 gcc 上的 -E,检查 Visual Studio 的文档或 gui 选项。

于 2009-07-30T09:01:06.057 回答
0

标准行应该编译。但是,如果您修改或删除了 Visual Studio 安装提供的标头中的某些文件,您将遇到麻烦,必须重新安装所有内容。

确保的一种方法是制作一个新的“hello world”控制台应用程序。它将在 stdafx.h 中包含 stdio。

我不认为这是您的问题,如果您想要更好的答案,您应该提供有关该问题的更多详细信息。

stdafx.h 中是否包含 stdio?

于 2009-07-30T08:49:33.600 回答
0

这件事今天发生在我身上,我花了四个令人沮丧的小时才解决它,即使在这个论坛中寻找答案之后,所以让我发布我的问题及其解决方案,以防其他人再次出现。

我有这个(稍微不太明显的形式):

    namespace MyApp
    {

    #include "MyUtilities.hpp"

    };

    #include "MoreUtilities.hpp"

两者都MyUtilities.hpp包含MoreUtilities.hpp<wait.h>,但第二次尝试(由库)sigval_t在 MoreUtilities.hpp 中使用标准系统类型引发了编译器错误(在标准库中)。至于原始海报,这是编译器发现的第一个错误;对我来说,它产生了一个恼人的“找不到类型”错误,考虑到它是标准类型并且“不在我的代码中”,这似乎显然是错误的。

<wait.h> 的第二次包含没有生成新代码,因为已经进行了定义。但是,由于位于不同的命名空间中,编译器没有找到它们。

当然,解决方案是确保#include <standard-header.h>在所有本地命名空间声明之外。

于 2011-11-23T23:36:39.050 回答
0

错误大多是未声明的标识符,例如_In_. IntelliSense 发现它们的定义很好。我应该在什么大方向上寻找造成这种情况的原因?

未声明的标识符可能意味着您的标准标头本身正在尝试include另一个标头(内部),没有找到它,因此没有正确声明/定义标识符。

补充:例如,在一个 cpp 文件中 stdio.h 是包含的第一个文件 - 在它之前没有我可以看到的定义。

Adefine不同于声明,声明不同于定义。您可能已经知道这一点,但我只是想确定一下。

由于该问题被标记为 C++,因此我鼓励您include cstdio使用stdio.h. 它可能无法修复编译器错误,但它是官方的 C++ 头文件。在 POSIX 系统上,您有时会发现标准 C 标头使用来自 POSIX 的内容进行了扩展。根据我的经验,您在这些标头的 C++ 化版本中没有相同的扩展名。

于 2009-07-30T09:16:42.533 回答
0

我认为有时不同版本的头文件库之间的不匹配也会导致这种情况。您最近是否安装了新版本的标准库,例如使用 SDK 或其他,或者使用过 PATH 之类的东西?

于 2009-07-30T09:53:53.720 回答