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

标签 c++ visual-c++ header-files

我有一个现有的功能齐全的项目,我正在尝试将功能添加到类(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 不能像其他文件一样引用其他项目文件?

这些文件在同一目录中,彼此相邻。

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

最佳答案

#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/

相关文章:

compilation - 如何修复 fatal error : zlib. h : no such file or directory?

c++ - 我应该同时使用头文件和 cpp/源文件吗?

c++ - 为什么我的 shell 只检测 0 - 255 之间的返回码?

C++ 结构和构造

c++ - VS 2013 RC 中的 Boost Fusion 编译错误

c - 我是否需要显式包含共享库中使用的通用头文件(在包含路径文件夹中)?

c++ - Unix 程序控制台与其他东西

c++ - UDP 发送()到 Winsock 下的本地主机丢弃数据包?

C++ :Writing Header Files Such that it improves the efficiency of program

c++ - Visual C++ 链接器崩溃 (VS2008 SP1)