从宏参数中提取子集

时间:2016-11-17 23:42:50

标签: c++ boost macros

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

  1. ABC_00_fld1
  2. ABC_01_fld1
  3. 我想要实现的是将这些参数传递给宏,在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;
    };
    

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

1 个答案:

答案 0 :(得分:-1)

您可以使用名为Stringification(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