Jason
Jason

Reputation: 1307

Reusing C code, giving struct multiple names

I have two header files

A.h

struct A { ... };
function declarations which use A

B.h

function declarations which use the struct A here, and have functions which also use A.
However, I want to call "A" B here.  How can I do this?  I want all the
functions in here use 
struct B, which I want to be exactly the same as struct A since 

An example of what I "want" to do, but uses defines and is probably the wrong way of doing things: (Note, it works perfectly how I want it to, but I don't think I should be using defines for this purpose, there is probably a better way of doing things)

A.h

#ifndef A_H
#define A_H

struct A {int x;};

void A_DoSomething(struct A* a);

#endif

B.h

#ifndef B_H
#define B_H

#include "A.h"

#define B A

void B_DoSomething(struct* B b) { A_DoSomething(b); }

#endif

So is there a way to do what I want without using define? I want to do this so I can reuse code. I.e., A is a linked list, B is a stack. I can completely define my stack data structure from a linked list.

EDIT: So basically B and A are equivalent, but for my B.h/B.c file, and any files using B.h, I just want to call the structure "B" and not "A"

Upvotes: 1

Views: 268

Answers (1)

4386427
4386427

Reputation: 44274

I would use typedef and use 3 h-files to separate the common data structure from A and B. Something like:

MyNode.h:

#ifndef MyNode_H
#define MyNode_H

typedef struct Node
{
  void *data;
  struct Node *next;
} Node;

#endif

A.h:

#ifndef A_H
#define A_H

#include "MyNode.h"

typedef Node A;

/* Declare functions for implementing a linked list using type A */

#endif

B.h:

#ifndef B_H
#define B_H

#include "MyNode.h"

typedef Node B;

/* Declare functions for implementing a stack using type B */

#endif

Main.c:

#include <stdio.h>
#include "A.h"
#include "B.h"

int main(void) {
  /* Here A and B can be used as types, example: */
  A list = {NULL, NULL};
  B stack = {NULL, NULL};


  return 0;
}

Upvotes: 3

Related Questions