0

我正在尝试创建一个宏来替换函数定义。这个宏应该在某个数组中注册函数的名称,以便其他宏可以对数组的元素做一些事情。

我想这样做以获得可以在控制台中使用的功能列表,而无需在添加新功能时编辑列表(它实际上是多个列表)。

在阅读了一下之后,我看了一下 boost 预处理器。不幸的是,似乎没有办法“保存”新数组。我想做的是这样的:

#define SOME_ARRAY (0, ())
#define CONSOLE_COMMAND(a) \
  #redefine SOME_ARRAY BOOST_PP_ARRAY_PUSH_BACK(SOME_ARRAY, #a) \
  void a(some_arguments)

不幸的是,据我所知,redefine 不存在,#define 不能在宏中使用(如果我错了,请纠正我)。

我查看了 boost 的预编译器的 SLOT,但我认为一旦设置,我也无法更改其中的变量。

除了编写我自己的预处理器之外,还有什么方法可以做到这一点?不是,学习如何写一个好的开始是什么?(将 MinGW 与 Code::Blocks 一起使用)。

4

2 回答 2

3

做类似事情的常用方法是使用特殊宏在头文件中声明函数。这个宏的定义将根据它包含在哪个源文件中而有所不同。通常它只会定义一个标准函数原型,但是当包含在一个特殊的源文件中时,它将被定义为在表中添加条目。

像这样的东西:

// functions.h
#ifndef FUNCTION_H_
#define FUNCTION_H_

#ifndef FUNCTION
# define FUNCTION(name) \
    void name(const std::vector<std::string> &);
#endif

FUNCTION(foo)
FUNCTION(bar)

#endif

// functions.cpp
// File that defines the function table

#include <functional>

using function_type = std::function<void(const std::vector<std::string> &)>;

#define FUNCTION(name) \
    { #name, name },

std::map<std::string, function_type> functions = {
#include "functions.h
};

现在你有一个std::map包含函数的指针,由函数名索引。

是的,您仍然需要维护您的函数的“列表”,即 中的原型列表functions.h,但是当您添加(或删除)函数时,“修改”这个列表非常容易。

于 2012-09-04T10:47:55.480 回答
0

预处理器的设计目的不是能够重新定义符号,因此您不能使用它来在文件传递中累积值。

一种可能的解决方案是使用重新定义和自我重新包含作为 X-Macros 技术:

#define CONSOLE_COMMAND(a,body) \
    void a(some_arguments) body

CONSOLE_COMMAND(my_command, { ... })

const char *array[] = {
#undef CONSOLE_COMMAND
#define CONSOLE_COMMAND(a,body) #a ,
#include __FILE__
};

更惯用的 C++ 解决方案是将您的命令作为文件范围对象,其构造函数在程序启动时注册它们。

于 2012-09-04T10:43:33.990 回答