【发布时间】:2020-05-04 10:42:53
【问题描述】:
我想在另一个定义中扩展一个定义,如下所示:
#define SCALAR_TYPES uint8_t, int8_t, uint16_t, int16_t, double, string
#define VECTOR_TYPES vector<uint8_t>, vector<int8_t>, vector<uint16_t>, vector<int16_t>, vector<double>, vector<string>
#define VARIANT_TYPENAMES SCALAR_TYPES, VECTOR_TYPES
这样 VARIANT_TYPENAMES 将扩展为一个列表,其中包含两个先前定义的宏的串联。 使用 -E 标志表明宏没有在 VARIANT_TYPENAMES 中展开,我需要以这种方式定义它们,因为 VECTOR_TYPES 将使用类似于here 描述的东西从 SCALAR_TYPES 生成。
有没有办法强制预处理器在宏内部展开宏?
编辑
澄清一下我的意图。我正在尝试实现一个通用的数据容器,可以从生成的 matlab 算法的 C 代码中使用。与此容器的交互必须使用纯 C 接口完成,因为生成的代码仅是 C,但接口后面的代码我可以使用 C++ 代码。
这个容器可以保存不同的标量类型和这些标量的向量,这可以使用 std::variant 来完成。
在 C 接口方面,我必须提供从容器中获取和放入数据的函数,如下所示:
extern "C"{
int getter_for_int(const char *key);
void put_for_intt(const char * key, int val);
void put_for_int_array(const char * key, int *val, uint32_t size);
}
这些只是其中的一小部分,但所有这些 getter 和 put-er 的实现从一种数据类型到另一种数据类型都非常相似,如果我可以让预处理器在 #define 中扩展宏,则这些函数可以由预处理器生成.
【问题讨论】:
-
不要使用宏。看起来这是
std::variant或类似的类型列表,因此您可以使用简单的typedef:using MyVariant = std::variant<the,whole,list,of,types>; -
使用
#define EVAL(x) x??? -
但是您已经在使用
vector<...>中的模板了。 -
如果您想要 C++ 代码的 C API(包含在
extern "C" {和}中的东西),那么您只能使用 C 中可用的类型。仅供参考:SO: Does extern “C” force limitations on my code? -
也许您应该编辑您的问题以显示应该如何使用宏。目前,还不清楚——无论如何,对我来说——你真正想要实现什么。