我正在尝试编译一个未指定的软件,我在标准标题中遇到错误,例如stdio.h
。错误主要是未声明的标识符,例如_In_
。 IntelliSense发现它们的定义很好。我应该在哪个方向找出原因?
补充:例如,在一个cpp文件中stdio.h
是第一个包含的文件 - 我之前没有可以看到的定义。没有使用预编译的头文件。我安装的其他内容编译得很好。
答案 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)
的可能性:
最佳诊断方法是转储预处理源。每个编译器都有一个选项。我相信它是-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.hpp
和MoreUtilities.hpp
都包含&lt; wait.h&gt;,但第二次尝试(由库)在MoreUtilities.hpp中使用标准系统类型sigval_t
会引发编译错误(在标准库中)。至于原始海报,这是编译器发现的第一个错误;对我来说,它产生了一个令人恼火的“未找到类型”错误,这似乎显然是错误的,因为它是标准类型,而且“不在我的代码中。”
第二个包含&lt; wait.h&gt;没有生成新代码,因为已经定义了。但是,编译器找不到它们,因为它们位于不同的命名空间中。
当然,解决方案是确保在所有本地名称空间声明之外#include <standard-header.h>
。