【问题标题】:C++: define macro to take an argument, and expand into multiple arguments of another macro?C ++:定义宏以获取参数,并扩展为另一个宏的多个参数?
【发布时间】:2022-01-07 06:15:22
【问题描述】:

我需要 boo 来获取两个显式变量/常量,或者一个扩展为两个变量/常量的宏调用。目前,这不编译。 Foo,一旦扩展,似乎不会被视为 boo 的多个参数。

#include <iostream>
#include <string>

int getInt(int x, int y)
{
    return x + y;   
}

#define boo(x, y) getInt(x, y)
#define foo(x) x, 1

int main()
{
  std::cout << boo(foo(1));
  std::cout << boo(1, 2);
}

有什么想法吗?

https://godbolt.org/z/79o7Td66x

【问题讨论】:

  • 它无法编译的原因是foo 的扩展被视为单个标记,例如在评估foo(1) 之后,该标记是1,1,但要将其传递给另一个宏或函数,它需要是一组标记(即1,1 需要是一组三个令牌)。无论如何,为什么foo()boo() 根本就需要是宏?为什么不int boo(int x, int y = 1) {return getInt(x,y);}

标签: c++ macros arguments


【解决方案1】:

不要使用宏(除非你需要)。

#include <iostream>
#include <string>

int getInt(int x, int y)
{
    return x + y;   
}

int boo(int x, int y = 1)  { return getInt(x,y); }
int foo(int x) { return x; }

int main()
{
  std::cout << boo(foo(1));
  std::cout << boo(1, 2);
}

【讨论】:

  • 遗憾的是,我对否决票并不感到惊讶。提出此类问题的人在被告知“不要按照您的要求去做,而是这样做”时会感到很糟糕。即使那是唯一正确和有效的回应。
  • 如果 OP 也有 #define foo2(x) x, 2 BTW,则不会扩展。
  • @Peter 一个完整的答案也许应该更彻底地解释为什么 OPs inteded 解决方案不起作用。另一方面“有什么想法吗?”相当模糊,我真的不明白 OP 试图解决的实际问题是什么。
  • @463035818_is_not_a_number 可能,但这可能需要非常详细地讨论与预处理器相关的翻译如何工作(文本替换、标记处理等)。正如你所说,这个问题很模糊。它也让我觉得是一个 XY 问题 - OP 似乎已经决定他们需要/想要使用预处理器(所以被问到)而不是描述一个问题(使用预处理器可能或 [在这种情况下更有可能] 可能不是一个可行的选择)。
  • 另外,请注意 OP 实际上并没有回复我的查询(在问题下方)。我想我写了那条评论,你同时写了你的答案,但本质上我是在询问为什么像你建议的选项不合适。
猜你喜欢
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多