C++ 从宏参数中提取子集

C++ 从宏参数中提取子集,c++,boost,macros,C++,Boost,Macros,我有大量变量名,每个变量名都有以下模式 ABC_00_fld1 ABC_01_fld1 我想把这些参数传递给宏,用C++来把前缀删掉。大概是这样的: #define MAKE_FLD( param )\ some manipulation on param #include <iostream> #include <string> #define MAKE_FLD(param) (std::string(#param).substr(7)) int main

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

  • ABC_00_fld1
  • ABC_01_fld1
  • 我想把这些参数传递给宏,用C++来把前缀删掉。大概是这样的:

    #define MAKE_FLD( param )\
        some manipulation on param
    
    #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;
    }
    
    预期结果:

    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;
    };
    

    上面这段话就是我努力实现目标的动机。还有其他方法可以实现上述功能,在我的宏generatedd结构中,我可以传递包含数据类型和变量名的枚举列表,而不是传递数据类型列表,然后将其提取出来,但是我必须手工构造我不喜欢的名称

    可以使用名为Stringification()的C预处理器功能来获取参数名的字符串版本

    从那里你可以操纵字符串;大概是这样的:

    #define MAKE_FLD( param )\
        some manipulation on param
    
    #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;
    }
    
    #包括
    #包括
    #定义MAKE#FLD(param)(标准::字符串(#param).substr(7))
    int main()
    {
    int ABC_00_fld1=0;
    
    std::cout字符串操作不是宏非常擅长的。关于这一点,有一些堆栈溢出问题-你搜索过吗?你的宏能扩展到函数调用吗?你打算用这些缩短的变量名做什么?@πάνταῥεῖ 这会有帮助吗?似乎OP希望在编译时进行这些修改,因为它们是变量名。@Ben我刚刚意识到OP不希望字符串化的东西。我恐怕这不是真的有问题(尽管OP谈论字符串化)。除非我误解了什么,否则OP希望将变量名转换为字符串。只有一种方法可以做到这一点,而不必硬编码与参数名匹配的字符串文本;这就是字符串化。也可以不使用std::string,而是将char*literal增加已知数量的字符:(#param+7)。这将使用正确的值获得编译时计算的const char*。我认为op需要更像
    int MAKE\u FLD(ABC\u 00\u fld1)=0;返回fld1;
    的值来工作。不过我们需要澄清。@johnsmith既然您编辑了问题,似乎您可以生成字段名了(以及结构名称或任何其他名称)进行连接。您可以执行#定义MAKE#FLD(p1,p2)(p1###p2)并使用类似MAKE#FLD(ABC#u00,fld1)的操作,这将导致ABC#u00#fld1不是字符串。