【问题标题】:C++ including a file in multiple filesC++ 在多个文件中包含一个文件
【发布时间】:2012-11-02 13:14:26
【问题描述】:

我正在尝试将某个类继承到 C++ 中的两个子类中。我希望子类并排运行,但它们都继承了超类entity.hpp

#include "../entity.hpp"
class Npc : public Entity
{}

#include "../entity.hpp"
class Human : public Entity
{}

当然,当我这样做时

#include "Npc.hpp"

#include "Human.hpp"

在同一个文件中,我遇到了一个问题,因为 entity.hpp 包含两次。我该如何解决这个问题?

编辑:.cpp 文件是错字。

【问题讨论】:

  • @ahenderson,您应该将您的评论作为 anwser 发布。
  • 你为什么要#include .cpp 文件?
  • @PaulR 这是问题中的错字。
  • @georgesl 现在太晚了,但我删除了我的评论,因为我意识到他包含了实现 (cpp) 文件,这是一个很大的 NO!。

标签: c++ inheritance include c-preprocessor


【解决方案1】:

在您的标头中使用包含保护,或使用 #pragma once 指令(不受广泛支持)。

【讨论】:

    【解决方案2】:

    您应该在entity.hpp 中使用include guards

    #ifndef ENTITY_HPP_
    #define ENTITY_HPP_
    
    // code
    
    #endif
    

    【讨论】:

    • 我需要尾随下划线吗?
    • 尾随下划线是一些人用来降低名称与其他 #define 值冲突的风险的命名方案。避免前导下划线,因为系统包含文件使用它们。
    • @Ken 你不需要它。关键是要避免冲突,最好使用更长、更具体的定义,比如SOMEPROJECT_SOMENAMESPACE_ENTITY_H_
    【解决方案3】:

    将代码包装在头文件中,如下所示:

    #ifndef ENTITY_HPP
    #define ENTITY_HPP
    
    <body of entity.hpp goes here>
    
    #endif
    

    【讨论】:

    • 所以我会将这些定义放在 entity.hpp 中?
    • 是的。第二次包含 entity.hpp 时,已经定义了 ENTITY_HPP 并且内容被忽略。只需确保包含守卫都有唯一的名称。
    【解决方案4】:

    您应该只包含“.h”或“.hpp”文件。如果您使用 Visual Studio,请添加

    #pragma once
    

    到每个头文件的顶部。如果你使用其他编译器,那么

    #ifndef MY_HEADER_FILE_NAME
    #define MY_HEADER_FILE_NAME
    
    class Human : public Entity
    {}
    
    #endif
    

    【讨论】:

    • 第一句错了,cpp文件也可以包含。
    • 如果做得好,这并不愚蠢。在某些情况下,批量构建会大大加快编译时间。
    • 建议您将您只能包含“.h”或“.hpp”文件更改为:您通常应该只包含“.h”或“.hpp” " 文件.
    • 首先,"如果你使用...,添加...。如果你使用...,添加..." - 不,使用那个首先适用于所有编译器的技术(包括警卫)。话虽如此,#pragma once 也被其他编译器所理解,但它仍然是一个依赖于平台的扩展,可以通过单一的平台无关技术轻松实现。您的回答表明 #pragma once 是 VS 的方式。包含守卫是每个编译器的方法,#pragma once许多编译器的替代方法。
    • @micnyk 这本身既不愚蠢也不错误。当然,它可能被使用不当,甚至被滥用,但几乎所有其他东西也可以。但它可以正确和明智地使用。举个例子,我有一个系统,其中很多 C 代码是由程序动态生成的,并且必须动态编译。为几百个自动生成的 .c 文件使用一个包含 #include 语句的主 .c 文件和一些额外的胶水,比单独编译所有这些文件然后将它们链接在一起更有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2010-09-18
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多