避免循环包含,同时保留所需的功能并且不进行额外的声明

avoiding circular includes while retaining desired functionality and not making extra declarations

我已经实现了一个泛型类型值,其中一个结构将数据类型存储为枚举,并将值存储为 type.c 中的联合,并在 type.h 中进行了声明。对于每个类型值,都有添加它们的方法(如双精度、整数、多项式等)。我在 type.c 中实现了一个功能 两个添加两个类型值及其在 type.h 中的声明。这个函数所做的就是调用类型特定函数来添加来自其他地方的两个类型化值。

例如,我声明了多项式的数据类型以及在 polynomial.h /polynomial.c.

中添加多项式的函数

现在我想将多项式视为它自己的类型。从我收集到的关于循环包含语句的其他帖子中,我需要在 type.h/type.c 中声明此多项式结构及其添加函数以避免任何问题。我想知道是否有另一种方法,因为必须在 type.h/type.c 中使用 declare/define 结构和函数会破坏将许多多项式相关的东西 declared/defined 在 polynomial.h/polynomial.c

// type.h

#ifndef TYPE_H
#define TYPE_H

typedef enum dtype dtype; 
typedef union value value;
typedef struct tvalue tvalue;

enum dtype {
    // double
    DBL,
    // PLY, // would like to have a PLY type here
};

union value {
    double dblval;
  //Polynomial polyval;  // would like to have polynomial type here
};

struct tvalue {
    dtype type;
    value val;
};

// if type poly, would like to call ply_add
t_sum(tvalue a, tvalue b, tvalue sum);
// polynomial.h

typedef struct Polynomial Polynomial;

struct Polynomial {
    dtype type; 
    int deg;
    tvalue *coefs;
};

void ply_add(Polynomial *p1, Polynomial *p2, Polynomial *sum);

您需要做几件事:

  1. 在types.h
  2. 中转发声明Polynomial
  3. types.h 中的类型可以使用指向 Polynomail
  4. 的指针
  5. #include types.h 然后 polynomial.h 在 types.c
  6. #include types.h 在 polynomail.h

说明:

  1. 前向声明告诉编译器该类型存在。它没有告诉它如何使用它。现在,如果您在 types.h
  2. 中引用 Polynomials,您将不会收到错误
  3. 尽管这使它变得有点困难,但您不能在 types.h 中使用 Polynomial,因为我们没有告诉编译器该类型是什么。然而,我们已经说过这种类型是存在的,并且编译器知道如何创建一个指针。所以我们可以创建一个指向 Polynomial
  4. 的指针
  5. 像往常一样在 types.c 中包含 types.h。然后在 types.c 中包含 polynomial.h 以告诉编译器什么是多项式。此时我们已完成处理 types.h,因此不会得到循环包含。至此我们知道了polynomial.c文件
  6. 里面的函数原型
  7. 我们已经告诉类型文件如何使用多项式文件,现在我们可以告诉多项式文件如何使用所有其他类型。