使用C预处理器生成函数声明

5

我需要以以下格式声明许多函数:

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
};

有没有一种方法可以使用C预处理器来部分自动化这个任务?理想情况下应该是像这样:

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"
};

不,预处理器不能做那样的事情。使用其他语言中的脚本来生成DEFINE_FOO行。 - Cecilio Pardo
听起来像是 XY 问题。为什么要这么多函数的堆积...?那些函数体呢? - Ilya
我个人会写一个快速的C#应用程序来帮我写文件。 - acid1789
2个回答

8
您可以使用 X 宏技巧:
// foo_list.h
#define MY_FUNCTIONS \
  X(foo_100)
  X(foo_200)
  X(foo_300)
  X(foo_400)

然后在您的 foo.h 文件中,您可以将 X 定义为各种宏并调用 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

这通常是在C预处理器中迭代列表的最简单方法之一。

我记不清我第一次看到这个是在哪里了,也许是这里


-2

C/C++ 预处理器无法打开文件等。

但是您可以使用脚本引擎,如 PHP 或 Python 来生成所需的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接