【问题标题】:Paste token at beginning of C/C++ macro definition在 C/C++ 宏定义的开头粘贴标记
【发布时间】:2021-11-13 17:48:04
【问题描述】:

在宏定义的开头是否有标记粘贴参数或非函数宏?换句话说,就像#define JOIN_TOKENS(a, b) ##a##b 这样的东西是被允许的。

一个例子是JOIN_TOKENS(Up, Here) 变成UpHere。另外,我希望任何作为参数传递的值都不会被扩展。这几乎做到了,但它产生了一个错误:

#define APPEND_TOKEN(a, b) a##b
#define VAR 0
#define JOIN(a, b) APPEND_TOKEN(##a, ##b)
JOIN(VAR, iable)

它应该产生VARiable,它确实产生了,但伴随着错误:

<stdin>:4:1: error: pasting formed '(VAR', an invalid preprocessing token
JOIN(VAR, iable)
^
<stdin>:3:33: note: expanded from macro 'JOIN'
#define JOIN(a, b) APPEND_TOKEN(##a, ##b)
                                ^
<stdin>:4:1: error: pasting formed ',iable', an invalid preprocessing token
<stdin>:3:38: note: expanded from macro 'JOIN'
#define JOIN(a, b) APPEND_TOKEN(##a, ##b)
                                     ^
/



VARiable
2 errors generated.

【问题讨论】:

  • 您能否发布一个输入/预期输出示例,以帮助可视化您希望达到的结果?
  • @JerryJeremiah 这会产生一个字符串,这不是我想要的。
  • @Melab 对不起,我完全误解了你的问题......

标签: c++ c c-preprocessor


【解决方案1】:

类似的东西?

//encloses the argument Arg in quotation marks
#define STRINGIFY(Arg) STRINGIFY_(Arg)
#define STRINGIFY_(Arg) #Arg

//concatenates the two arguments Arg1 and Arg2 to a new token
#define CAT(Arg1, Arg2) CAT_(Arg1, Arg2)
#define CAT_(Arg1, Arg2) Arg1##Arg2

测试

#define A MY_
#define B SPECIAL_
#define C TYPE

printf("%s\n", STRINGIFY(CAT(A, CAT(B, C))));
//output: MY_SPECIAL_TYPE

/* or */

#define MY_VAR CAT(A, CAT(B, C))
typedef int MY_VAR;

MY_VAR i = 42;

printf("%d\n", i);
//output: 42

【讨论】:

  • 不。这会产生一个字符串。
  • STRINGIFY 生成一个字符串,而不是 CAT。我添加了 STRINGIFY 宏用于测试目的。
  • 使用预处理器输出进行测试。 stackoverflow.com/a/3742831/9072753
  • @heapunderrun 好点。
【解决方案2】:
#define APPEND_TOKEN(a, b) a##b
#define VAR 0
#define JOIN(a, b) APPEND_TOKEN(##a, ##b)
JOIN(VAR, iable)

它应该产生 VARiable

只需使用以下代码:

#define VAR 0
#define JOIN(a, b)   a##b
JOIN(VAR, iable)

产生以下预处理器输出。在godbolt 上测试:

VARiable

【讨论】:

  • VAR 是宏时不起作用。我特别提到了令牌粘贴,所以我不希望 a 扩展,就像 b 不会扩展一样。
  • 当 VAR 是宏时它确实有效。我不明白。使用在线链接编辑了答案。 ## 中的宏参数不会重新扫描以进行进一步替换。
  • 对不起。你说的对。我正在考虑一组我认为与您的足够相似的宏。
  • 现在如果您希望 VAR 扩展呢?
  • 然后从另一个答案中看到CAT......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多