我在Visual Studio 2008下工作,也许这很重要。
在一个更大的项目中,我决定将我的一个.cpp文件拆分为两个。当我将一些函数移动到一个新文件时,让我们称它为new.cpp
,并尝试编译,我得到的错误是new.cpp
不知道fstreams
的定义,{{1现在,在新文件的最顶部我添加了自己的标题,我们称之为setw()
,而main_header.h
又包含所有必需的<iostream>
,<iomanip>
等这在整个项目中使用的旧文件中都可以正常工作,但出于某种原因不在new.cpp
中。
如果我添加
#include <fstream>
#include <iomanip>
// and all the rest
在new.cpp
中然后一切正常,但这不是我想要解决的方法。
我想也许main_header.h
的内容在编译时没有附加到new.cpp
,但事实并非如此,我尝试在new.cpp
中使用main_header.h
中声明的外部变量并定义在不同的.cpp中,在编译,链接或运行时没有错误。然而,<fstream>
中包含的<iomanip>
和main_header.h
似乎没有成为new.cpp
文件。
我对Visual Studio比较陌生,所以我的问题的解决方案很可能是我不知道的傻事,但我花了很多时间试图弄清楚这个问题并且无济于事。新文件肯定是项目的一部分,因为构建项目会尝试编译它,加上我在iostream
中包含iomanip
和new.cpp
后,我可以在其他部分调用它的例程。项目。我可能做错了什么想法?
main_header.h
看起来像那样
#ifndef MAIN_HEADER
#define MAIN_HEADER
#include <iomanip>
#include <fstream>
// loads of other stuff
#endif // for MAIN_HEADER
更新:好的,所以在我使用相同的文件创建一个全新的项目后的第二天,现在一切正常,我不需要在new.cpp中包含iomanip
或其他任何内容。这肯定是因为VS不是代码本身的一些奇怪的事情,但仍然打败了我究竟是什么问题。
答案 0 :(得分:1)
这可能是由前缀头或预编译头引起的,可以在整个项目中设置,也可以只在new.cpp
文件上设置,这可以解释为什么会有一些区别。这里有几件事要尝试:
new.cpp
节点 - 这是查找此单个文件是否具有不同编译器设置的快速方法new.i
文件,其中包含所有#includes和宏。比较这两个文件的结果并查找差异 - 这可能会显示为什么一个工作而另一个不工作答案 1 :(得分:0)
你还有另一个标题还有#define MAIN_HEADER
吗?
通过复制旧标题创建新标题时,很容易犯这样的错误,并导致像这样的神秘症状。