Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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"
};
like image 862
PaulH Avatar asked Mar 14 '23 11:03

PaulH


1 Answers

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.

like image 97
Chris Beck Avatar answered Apr 29 '23 15:04

Chris Beck