我有一个现有的功能齐全的项目,我正在尝试将功能添加到类(class)项目中。我什至无法通过第一步(这不是一个好兆头)。
我添加了一个新的 .h 文件,但它充满了错误。
.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();
}
};
右击项目名称>添加>新项目>“头文件”然后命名为greater.h我在greater.h文件中输入了以下代码:
class Greater: public SubExpression
{
public:
Greater(Expression* left, Expression* right):
SubExpression(left, right)
{
}
double evaluate()
{
return left->evaluate() > right->evaluate();
}
};
这个文件给了我两个错误(如果我尝试输入任何其他内容,它只会添加到错误列表中。无论出于何种原因,它显然都没有以任何方式链接到项目。错误如下:
(在 SubExpression 类上):不是类或结构名称
关于“类”一词:PCH 警告:找不到合适的页眉停止位置。未生成智能感知 PCH 文件。
这不可能很复杂,但我已经搜索了几个小时,但我无法弄清楚为什么这个基本过程会失败。
为什么 greater.h 不能像其他文件一样引用其他项目文件?
这些文件在同一目录中,彼此相邻。
编辑 我正在添加屏幕截图,以便您可以看到我个人所指的内容。
最佳答案
#include
仅仅是文本替换。它将文件的内容放在 #include
的位置。陈述。因此,当从一个 cpp 文件中包含不同的相互依赖的头文件时,它可能会导致看似奇怪的效果。
C++ 编译器总是从翻译单元(例如 cpp 文件)开始编译。 header 仅包含在旅途中。因此, header 不必知道 SubExpression
。 , 但 cpp 文件首先包含 greater.h
必须了解 SubExpression
在到达 Greater
之前.
例子(测试.cpp):
#include "greater.h" // Fails - what is SubExpression?
#include "subexpression.h"
#include "divide.h" // Works, by now the compiler knows about SubExpression
如您所见,包含的顺序可能会导致看起来相同的 header 表现不同。
为了避免此类问题,让 header 自给自足很重要。它们应该包括编译它们所必需的一切。在父类的情况下,您肯定需要 SubExpression 的定义,因此放置 #include "subexpression.h"
没有什么坏处。在所有源自 SubExpression
的类的顶部.
如果这样做,上面的例子会引起新的问题,因为“subexpression.h”会被包含三次,会引起重定义错误。因此,您还应该使用 #ifdef
放置包含守卫。或 #pragma once
在头文件的顶部。
PCH 错误可能是因为预编译头文件必须包含在任何使用预编译输出的 cpp 文件中作为第一个头文件。例如,如果您的预编译 header 名为“common.h”,则使用它的每个 cpp 文件都必须具有 #include "common.h"
作为 cpp 文件中的第一条语句(忽略注释)。
关于c++ - 我有一个现有的 C++ 项目,我想在 Visual C++ 中添加一个新的头文件。我收到无数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22157488/