C++ 我有一个现有的C++;我想在Visual C+;中添加新头文件的项目+;。我犯了无数错误
我有一个现有的完全功能性的项目,我正在尝试将功能添加到课程项目中。我甚至无法通过第一步(这不是一个好迹象) 我添加了一个新的.h文件,它充满了错误C++ 我有一个现有的C++;我想在Visual C+;中添加新头文件的项目+;。我犯了无数错误,c++,visual-c++,header-files,C++,Visual C++,Header Files,我有一个现有的完全功能性的项目,我正在尝试将功能添加到课程项目中。我甚至无法通过第一步(这不是一个好迹象) 我添加了一个新的.h文件,它充满了错误 .h项目中已存在的文件: divide.h subexpression.h etc. etc. divide.h的全部功能内容: class Divide: public SubExpression { public: Divide(Expression* left, Expression* right): SubExpre
.h
项目中已存在的文件:
divide.h
subexpression.h
etc. etc.
divide.h
的全部功能内容:
class Divide: public SubExpression
{
public:
Divide(Expression* left, Expression* right):
SubExpression(left, right)
{
}
double evaluate()
{
return left->evaluate() / right->evaluate();
}
};
在右键单击项目名称>添加>新建项>“头文件”并将其命名为更大的.h之后,我在更大的.h文件中键入了以下代码:
class Greater: public SubExpression
{
public:
Greater(Expression* left, Expression* right):
SubExpression(left, right)
{
}
double evaluate()
{
return left->evaluate() > right->evaluate();
}
};
此文件给了我两个错误(如果我尝试键入任何其他内容,它只会添加到错误列表中。无论出于何种原因,它显然没有以任何方式链接到项目。错误如下:
(在子表达式类上):不是类或结构名称
在单词“class”上:PCH警告:找不到合适的标头停止位置。未生成intellisense PCH文件。
这不可能很复杂,但我已经搜索了几个小时,我不知道为什么这个基本过程失败了
为什么Better.h不能以与其他文件相同的方式引用其他项目文件
这些文件位于同一目录中,彼此紧挨着
编辑
我添加了一个屏幕截图,这样你就可以看到我个人所指的内容。
#include
仅仅是一种文本替换。它将文件的内容放在#include
语句的位置。因此,当包含来自cpp文件的不同相互依赖的标题时,它可能会导致看似奇怪的效果
C++编译器总是从翻译单元(如cpp文件)开始编译。头只在运行时包含。因此,头不必知道子表达式
,但cpp文件首先包含更大的内容。h
必须在到达更大的之前知道子表达式
示例(test.cpp):
如您所见,包含的顺序可能会导致外观相同的标题表现不同
为了避免此类问题,使标题自给自足是很重要的。它们应该包括编译它们所需的所有内容。对于父类,您肯定需要子表达式的定义,因此在标题中添加一个#include“SubExpression.h”是无害的
位于从子表达式派生的所有类的顶部
如果这样做,上述示例将导致新问题,因为“subexpression.h”将被包含三次,并将导致重新定义错误。因此,还应使用#ifdef
或#pragma一次性将include-guard放置在头文件顶部
可能会导致PCH错误,因为预编译头必须作为使用预编译输出的任何cpp文件中的第一个头包含。例如,如果您的预编译头被称为“common.h”,则使用它的每个cpp文件都必须将#include“common.h”
作为cpp文件中的第一条语句(忽略注释)。\include“SubExpression.h”
“divide.h
文件不需要/使用include,为什么greater.h
”?这也不能解决问题。只需添加错误“需要文件名”“这就是greater.h
中的全部内容吗?您是否有#include
用于声明子表达式
的位置?您没有向我们显示足够的文件(或者如果这是文件的全部,那就是问题所在)。@crashmstr在那里,greater.h文件可以与divide.h
相同(在同一目录中)除除法被替换为更大之外,我得到了与后续错误相同的原始错误。还要注意的是,这不是C#(或使用包、程序集等的任何其他语言)。除非将头文件包含在翻译单元的编译路径中(通常为*.c或*.cpp文件),否则将头文件添加到项目中不会有任何区别。
#include "greater.h" // Fails - what is SubExpression?
#include "subexpression.h"
#include "divide.h" // Works, by now the compiler knows about SubExpression