PaulH
PaulH

Reputation: 7853

Using the C preprocessor to generate function declarations

I have a lot of functions to declare in this format:

int foo_100(int, int);
int foo_200(int, int);
int foo_300(int, int);
int foo_400(int, int);

typedef int (*foo)(int, int);
struct foo foo_library[] = {
    foo_100,
    foo_200,
    foo_300,
    foo_400
};

Is there a way I can use the C preprocessor to partially automate this task? Ideally, something like this:

foo.txt

100
200
300
400

foo.h

typedef int (*foo)(int, int);

#define DEFINE_FOO(id_) int  foo_##id_(int, int);

DEFINE_FOO(#include"foo.txt")

struct foo foo_library[] = {
    #include "foo.txt"
};

Upvotes: 5

Views: 1039

Answers (2)

Chris Beck
Chris Beck

Reputation: 16204

You could use the X macro trick:

// foo_list.h
#define MY_FUNCTIONS \
  X(foo_100)
  X(foo_200)
  X(foo_300)
  X(foo_400)

Then in your foo.h file you define X as various macros and invoke MY_FUNCTIONS.

// foo.h
#include "foo_list.h"

#define X(NAME) \
int NAME(int, int);

MY_FUNCTIONS

#undef X

#define X(NAME) NAME,

typedef int (*foo)(int, int);
struct foo foo_library[] = {
  MY_FUNCTIONS NULL
};

#undef X

This is often one of the easiest ways to iterate over a list in the C preprocessor.

Don't remember where I first saw this, maybe it was here.

Upvotes: 8

c-smile
c-smile

Reputation: 27460

С/С++ preprocessor cannot open files and the like.

But you can use scripting engines like php or python to generate files you need.

Upvotes: -2

Related Questions