【问题标题】:extract subset from macro argument从宏参数中提取子集
【发布时间】:2016-11-17 23:42:49
【问题描述】:

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

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

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

【问题讨论】:

  • 字符串操作不是宏所擅长的。有一些关于这个的堆栈溢出问题 - 你谷歌了吗?
  • 你的宏能扩展到函数调用吗?
  • 你打算用这些缩短的变量名做什么?
  • @πάνταῥεῖ 这会有帮助吗? OP 似乎希望在编译时进行这些修改,因为它们是变量名。
  • @Ben 我刚刚意识到 OP 不想要字符串化的东西。

标签: c++ boost macros


【解决方案1】:

您可以使用称为字符串化 (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

【讨论】:

  • 恐怕这并不是真正的问题(尽管 OP 谈到了 stringification)。
  • 除非我有什么误解,否则 OP 想把变量名变成字符串。只有一种方法可以做到这一点,而无需硬编码与参数名称匹配的字符串文字;那就是字符串化。也可以不使用 std::string 而是将 char* 文字增加已知数量的字符:(#param + 7)。这将使编译时间计算 const char * 具有正确的值。
  • 我认为 op 想要更像 int MAKE_FLD(ABC_00_fld1) = 0; return fld1; 的东西来工作。不过我们需要澄清一下。
  • @johnsmith 既然您编辑了您的问题,您似乎可以通过串联来生成您的字段名称(以及结构名称或任何其他名称)。您可以执行 #define MAKE_FLD(p1, p2) (p1##p2) 并使用类似 MAKE_FLD(ABC_00_, fld1) 的方法,这将导致 ABC_00_fld1 不是字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
相关资源
最近更新 更多