我在标准库中遇到编译错误。这是怎么回事?

时间:2009-07-30 08:32:57

标签: c++ visual-c++ stdio std

我正在尝试编译一个未指定的软件,我在标准标题中遇到错误,例如stdio.h。错误主要是未声明的标识符,例如_In_。 IntelliSense发现它们的定义很好。我应该在哪个方向找出原因?

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

7 个答案:

答案 0 :(得分:6)

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

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

因此,您的项目配置错误,或者您的代码中的某些内容会影响所包含的文件(例如,某些错误的#defines)

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

答案 1 :(得分:2)

由于VS喜欢使用预编译头文件,因此您可能需要确保没有违反任何假设。麻烦的一个原因是在包含stdafx.h的行之前命名任何标题。

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

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

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

如果没有,那么你的VS安装会出现严重问题。

另一个可能但不太可能的麻烦来源是如果您安装了其他编译​​器,并且不知何故意外地使用另一个stdio.h意外地获得了VS ...一个不合适的INCLUDE环境变量曾经能够导致这种情况,但我不确定它在最近的版本中是做什么的。很久以前我被这个烧了,而且从那时起我就让个别编译器在全球环境中设置的变量更加谨慎。

答案 2 :(得分:2)

的可能性:

  • 使用错误的标志进行编译。具体来说,你的包含路径没有正确设置,你正在编译C ++而不是C,这些就是这些。
  • 您在标题前面包含了重新定义标准标题内容的内容。你的问题不太可能发出这种声音。
  • 您在编译器命令行中定义的内容正在搞乱。
  • 您的标题不正确,错误,不适用于您的编译器版本等。
  • 您的编译器不正确,错误,不符合标准等。

最佳诊断方法是转储预处理源。每个编译器都有一个选项。我相信它是-E on gcc,请查看visual studio的docs或gui选项。

答案 3 :(得分:0)

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

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

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

stdio是否包含在stdafx.h中?

答案 4 :(得分:0)

  

错误主要是未声明的标识符,例如_In_。 IntelliSense发现它们的定义很好。我应该在哪个方向找出原因?

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

  

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

define与声明不同,声明与定义不同。你可能已经知道了,但我只想确定。

由于问题被标记为C ++,我建议您include cstdio而不是stdio.h。它可能不会修复编译器错误,但它是官方的C ++标头。在POSIX系统上,您有时会发现标准C头扩展了来自POSIX的东西。根据我的经验,你在C ++中没有相同的扩展 - 那些标题的ified版本。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

我有这个(略显不明显的形式):

    namespace MyApp
    {

    #include "MyUtilities.hpp"

    };

    #include "MoreUtilities.hpp"

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

第二个包含&lt; wait.h&gt;没有生成新代码,因为已经定义了。但是,编译器找不到它们,因为它们位于不同的命名空间中。

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