gpt4 book ai didi

c++ - 预处理器数组生成

转载 作者:行者123 更新时间:2023-11-28 00:54:33 26 4
gpt4 key购买 nike

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

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

阅读了一些内容后,我了解了升压预处理器。不幸的是,似乎没有办法“保存”新阵列。我想做的是这样的:

#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 结合使用)。

最佳答案

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

像这样:

// 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 中的原型(prototype)列表,但是当您添加(或删除)函数时,很容易“修改”它列表。

关于c++ - 预处理器数组生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12261500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com