正在解析包含顺序

Resolving Inclusion Ordering

本文关键字:包含 顺序      更新时间:2023-10-16

我正在开发一个不是我自己的代码库,它有以下布局:

object.h:

// Objects are defined
// #include "tickets.h" (functions to access the objects)
// An access-handler object is defined

我想介绍一个类,它知道对象,可以从tickets.h中的函数访问,但也可以使用访问处理程序对象。函数是独立的,即ticket.h中调用的类函数不使用访问处理程序(如果不是这样的话,我不知道从哪里开始)。

因此,我的类需要在tickets.h之前定义,但它的一些函数需要在访问处理程序之后定义。有没有一种方法可以做到这一点,而不将其拆分为两个头文件,如下所示:

// Objects are defined
//  -- include declaration of class, and definition of functions that tickets.h needs
// #include "tickets.h"
// An access-handler object is defined
//  -- include functions of class that need the access-handler

把这样的东西分成两个单独的文件似乎很混乱,我希望能把所有的东西都包含在内。

感谢您的帮助,我显然对c++中的声明/定义只有非常初步的了解。

编辑:如果我使用前向声明并将其包含在tickets.h之前(在mynewclass.h中声明的类和在mynewclass.cc中定义的函数)mynewclass.cc是否能够使用在包含mynewclass.h.之后声明的对象即访问处理程序对象。

第二版:类似的东西:

object.h:

class obj { // definition }
#include "tickets.h"
class obj_handler {
    public void handle { // code }
}

票。h:

void do_something(obj o){
    communicator.foo();
}

我的对象(通讯器):

class communicator {
    public:
        void foo() { // code } 
        void bar() { // use handle() from obj_handler }
}

正如您所看到的,我的通信器需要在tickets.h中使用,但在obj_handler之后才能定义。那么我应该把它包括在哪里呢?

如果我正确理解你的问题,你可以使用正向声明来解决这个问题。这将允许您在定义某个类的方法之前声明该类。例如:

// this is forward declaration of class A, no definition provided
class A;
class B
{
// uses A
A * a_;
};
// class A definition
class A
{
// may use class B now
B * b_;
};

我不太确定我是否理解这一点,而且我在这里还没有足够的声誉来对此发表评论,所以让我试着用这种方式回答你的问题,如果我猜错了,请随时跟进:

我相信您所指的是一个完整的类定义,即包含类声明中所有函数定义的定义。除此之外,对象定义后面跟着预处理器指令的情况并不常见。不过,典型的是函数的前向声明和类原型。

因此,例如,您可以在一些header.h:中声明

class C 
{
public:
    void method1(void);
    int method2(void);
};

并且在一些implementation.cpp中定义了如下函数:

void C::method1(void) { /*...*/ }

在包含链中访问处理程序前面的另一个文件中,您可以定义另一个函数:

int C::method2(void) { /*...*/ }

顺便问一下,您所说的访问处理程序是什么意思?

哦,如果您在头文件中进行函数定义,那么您的链接器可能会对您大喊大叫。


关于你的附录:无论你在哪里提出一个正向声明,粗略地说,编译器都会插入一个有问题的声明副本,将其视为文件系统上下文中的软链接。如果您有许多函数签名或类的前向声明,那么它会带来负面影响,比如增加编译的持续时间和内存负载。不可能判断这是否适用于您的特定情况,因为只有您知道有问题的实际代码。但它很可能会奏效。

看看这些页面:

  1. http://en.wikipedia.org/wiki/Forward_declaration
  2. 我什么时候可以使用远期申报