我正在尝试编译一个未指定的软件,并且在标准头文件中出现错误,例如stdio.h
. 错误大多是未声明的标识符,例如_In_
. IntelliSense 发现它们的定义很好。我应该在什么大方向上寻找造成这种情况的原因?
补充:例如,在一个 cpp 文件stdio.h
中包含第一个文件 - 在它之前没有我可以看到的定义。不使用预编译头文件。我安装的其他东西编译得很好。
我正在尝试编译一个未指定的软件,并且在标准头文件中出现错误,例如stdio.h
. 错误大多是未声明的标识符,例如_In_
. IntelliSense 发现它们的定义很好。我应该在什么大方向上寻找造成这种情况的原因?
补充:例如,在一个 cpp 文件stdio.h
中包含第一个文件 - 在它之前没有我可以看到的定义。不使用预编译头文件。我安装的其他东西编译得很好。
“你在做一些未指明的错误”是我能做的最好的事情。
标准库确实可以编译,我可以告诉你这么多。
因此,要么您的项目配置错误,要么您的代码中的某些内容影响了包含的文件(例如,可能是一些错误的#defines)
如果您想要更具体的答案,您必须向我们提供一些具体信息。你得到了哪些错误?文件是如何包含的?你能展示一些重现问题的最小代码吗?
由于 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 环境变量曾经能够导致这种情况,但我不确定它确实如此在最近的版本中。很久以前我就被它烧死了,从那时起我就让各个编译器在全局环境中设置哪些变量更加小心。
可能性:
最好的诊断是转储预处理的源。每个编译器都有一个选项。我相信它是 gcc 上的 -E,检查 Visual Studio 的文档或 gui 选项。
标准行应该编译。但是,如果您修改或删除了 Visual Studio 安装提供的标头中的某些文件,您将遇到麻烦,必须重新安装所有内容。
确保的一种方法是制作一个新的“hello world”控制台应用程序。它将在 stdafx.h 中包含 stdio。
我不认为这是您的问题,如果您想要更好的答案,您应该提供有关该问题的更多详细信息。
stdafx.h 中是否包含 stdio?
这件事今天发生在我身上,我花了四个令人沮丧的小时才解决它,即使在这个论坛中寻找答案之后,所以让我发布我的问题及其解决方案,以防其他人再次出现。
我有这个(稍微不太明显的形式):
namespace MyApp
{
#include "MyUtilities.hpp"
};
#include "MoreUtilities.hpp"
两者都MyUtilities.hpp
包含MoreUtilities.hpp
<wait.h>,但第二次尝试(由库)sigval_t
在 MoreUtilities.hpp 中使用标准系统类型引发了编译器错误(在标准库中)。至于原始海报,这是编译器发现的第一个错误;对我来说,它产生了一个恼人的“找不到类型”错误,考虑到它是标准类型并且“不在我的代码中”,这似乎显然是错误的。
<wait.h> 的第二次包含没有生成新代码,因为已经进行了定义。但是,由于位于不同的命名空间中,编译器没有找到它们。
当然,解决方案是确保#include <standard-header.h>
在所有本地命名空间声明之外。
错误大多是未声明的标识符,例如
_In_
. IntelliSense 发现它们的定义很好。我应该在什么大方向上寻找造成这种情况的原因?
未声明的标识符可能意味着您的标准标头本身正在尝试include
另一个标头(内部),没有找到它,因此没有正确声明/定义标识符。
补充:例如,在一个 cpp 文件中 stdio.h 是包含的第一个文件 - 在它之前没有我可以看到的定义。
Adefine
不同于声明,声明不同于定义。您可能已经知道这一点,但我只是想确定一下。
由于该问题被标记为 C++,因此我鼓励您include
cstdio
使用stdio.h
. 它可能无法修复编译器错误,但它是官方的 C++ 头文件。在 POSIX 系统上,您有时会发现标准 C 标头使用来自 POSIX 的内容进行了扩展。根据我的经验,您在这些标头的 C++ 化版本中没有相同的扩展名。
我认为有时不同版本的头文件库之间的不匹配也会导致这种情况。您最近是否安装了新版本的标准库,例如使用 SDK 或其他,或者使用过 PATH 之类的东西?