我有一个现有的C ++项目我想在Visual C ++中添加一个新的头文件。我得到了无数的错误

时间:2014-03-03 21:09:57

标签: 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):
        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类上):不是类或结构名称

单词“class”: PCH警告:找不到合适的标题停止位置。未生成智能感知PCH文件。

这可能不复杂,但我搜索了几个小时,我无法弄清楚为什么这个基本过程失败。

为什么不能以与其他文件相同的方式引用其他项目文件?

这些文件位于彼此相邻的同一目录中。

修改 我正在添加屏幕截图,以便您可以看到我个人所指的内容。 Visual C++ header

1 个答案:

答案 0 :(得分:2)

#include仅仅是文字替代品。它将文件的内容放在#include语句的位置。因此,当从cpp文件中包含不同的相互依赖的头时,它可能会导致看似奇怪的效果。

C ++编译器总是从翻译单元(如cpp-file)开始编译。标题只包含在旅途中。因此,标头不必知道SubExpression,但是第一个包含greater.h的cpp文件在到达SubExpression之前必须知道Greater

示例(test.cpp):

#include "greater.h" // Fails - what is SubExpression?
#include "subexpression.h"
#include "divide.h" // Works, by now the compiler knows about SubExpression

如您所见,包含的顺序可能导致看起来相同的标题行为不同。

为了避免这些问题,重要的是使标题自给自足。它们应该包括编译它们所需的一切。如果是父类,您肯定需要SubExpression的定义,因此将#include "subexpression.h"放在源自SubExpression的所有类的顶部没有任何害处。

如果你这样做,上面的例子将引起新的问题,因为“subexpression.h”将被包含三次并将导致重新定义错误。因此,您还应该在头文件顶部使用#ifdef#pragma once放置包含警戒。

可能导致PCH错误,因为必须使用预编译输出将预编译头作为第一个头包含在任何cpp文件中。例如,如果您的预编译头被称为“common.h”,则每个使用它的cpp文件必须具有#include "common.h"作为cpp文件中的第一个语句(忽略注释)。