c++ - 从宏参数中提取子集

标签 c++ boost macros

我有大量变量名,每个变量名都具有以下模式,

  1. ABC_00_fld1
  2. ABC_01_fld1

我想要实现的是将这些参数传递给 c++ 中的宏并去除前缀。像这样:

#define MAKE_FLD( param )\
    some manipulation on param

预期结果:

MAKE_FLD( ABC_00_fld1 ) =>  fld1

我知道我们可以通过简单的函数来实现这一点,但是我对宏的选择有限制,而且我还有很多其他移动的部分将获取上述函数以生成更多的宏。我不知道在 C++ 中执行此操作的方法。我已经研究过 stringify,但我不确定这是否符合要求。请发表您的建议。

编辑: 阅读所有建议迫使我提供更多背景知识。给出一些关于这个宏的使用的观点。考虑应用程序正在使用宏生成结构。所以每个结构都会有一堆数据成员。上面提到的“ABC_00_fld1”成为在应用程序的其他部分定义的类的数据类型。所以在通过宏生成的结构中看起来像这样。

struct macro_struct_fld1 {
    ABC_00_fld1 fld1;
};

struct macro_struct_fld2 {
    ABC_01_fld1 fld1;
};

上面的这段代码是我想要实现的目标的动力。还有其他方法可以实现上述目标,在我的宏生成结构中而不是传递数据类型列表,我可以传递包含数据类型和变量名的枚举列表并将其提取出来,但随后我必须手工构建我不喜欢的名字。

最佳答案

您可以使用称为字符串化 (https://gcc.gnu.org/onlinedocs/cpp/Stringification.html) 的 C 预处理器功能来获取参数名称的字符串版本。

从那里你可以操作字符串;像这样:

#include <iostream>
#include <string>

#define MAKE_FLD(param) (std::string(#param).substr(7))

int main()
{
    int ABC_00_fld1 = 0;

    std::cout << MAKE_FLD(ABC_00_fld1) << std::endl;

    return ABC_00_fld1;
}

这输出“fld1”。此处编译和测试的代码:http://cpp.sh/8tkk

关于c++ - 从宏参数中提取子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40667044/

相关文章:

c++ - boost `less_than` 两种版本的实现

c++ - 为什么不能将字符串文字连接到 __FUNCTION__?

c - 如何使用 ## 运算符连接和计算宏

c++ - std::vector 或 std::list 用于 std::unordered_map 存储桶?

c++ - 外包导入错误

c++ - 在 C++ 中实现 "app.exe -instruction file"符号

c++ - 基于整数类型 "signed-ness"的部分模板特化?

c++ - 模板 vector

c++ - boost::asio::local::stream_protocol::acceptor 抛出错误

macros - Factor Clojure 代码使用绑定(bind)到 var 或本地的参数映射在 Java 对象中设置许多不同的字段