gpt4 book ai didi

c - 嵌套宏中的标记和##

转载 作者:太空宇宙 更新时间:2023-11-04 04:20:17 25 4
gpt4 key购买 nike

来自 The C Programming Language,作者 KRC(第 231 页)

After

#define cat(x, y)       x ## y 

the call cat(var, 123) yields var123. However, the call cat(cat(1,2),3) is undefined: the presence of ## prevents the arguments of the outer call from being expanded. Thus it produces the token string cat ( 1 , 2 )3 and )3 (the catenation of the last token of the first argument with the first token of the second) is not a legal token.

我不明白语句:“(第一个参数的最后一个标记与第二个参数的第一个标记的串联)”。什么是“第一个参数的最后一个标记”,什么是“第二个参数的第一个标记”?也许 K&R 中有一个错误,它应该写成:“因此它产生标记字符串 cat ( 1 , 2 and )3 (第一个参数的最后一个标记与第二个参数的第一个标记的串联)不是一个合法的 token 。”我说得对吗?

最佳答案

What is "the last token of the first argument" and what is "the first token of the second"?

C预处理器的词法元素定义明确;它们在第 6.4 节的标准中列出(并再次在附录 A 中)。预处理标记可以是一个header-name、一个identifier、一个pp-number、一个ccharacter-constantstring-literalpunctuator 或不属于这些的单个非空白字符。 (还有一个理论上可以发挥作用的“地标标记”;这些是临时标记,当替换列表中提到的参数与不包含标记的参数匹配时发挥作用,但这里不适用)。

具体来说,cat(1,2) 由六个标记组成;标识符 cat, 标点符号 (, pp-number 1, punctuator ,, pp-number 2 和标点符号 )3 是一个 pp 数。

cat(cat(1,2),3) 在此上下文中是带有两个参数的宏调用;第一个是 cat(1,2),第二个是 3

评估宏的第一步是参数替换。在此阶段,替换列表中提到的任何参数在完全计算后都会被相应的参数替换,除非替换列表中的参数正在被字符串化(前面是#) 或参与粘贴(在 ## 之后或之前)。在这种情况下,xy 都参与粘贴,因此不会发生参数替换。

参数替换后,字符串化和粘贴以未指定的顺序发生。由于在这种情况下我们有一个粘贴运算符,所以我们执行粘贴。粘贴时,arguments 中的标记替换替换列表中的相应参数;然后 ## 被删除,前面 标记(在本例中为标点符号 ))与 后面 连接 token (在本例中为 pp-number 3)。该标准规定,如果结果不是有效的预处理标记,则行为未定义。这适用于这种情况; )3 不是有效的预处理标记(它不是上面提到的七件事之一),因此结果未定义。

Maybe there is a mistake in K&R

原始措辞没问题(虽然我不确定在这种情况下“ token 字符串”到底是什么)。这可能只是一个措辞问题;有两个语句:

  1. “因此它生成标记字符串 cat ( 1 , 2 )3”
  2. ")3(第一个参数的最后一个标记与第二个参数的第一个标记的串联)不是合法标记"

...用“和”连接。第二个陈述的主题是“)3”。我不确定如何阅读您建议的替换(K&R 的意思是 )3 不是有效的预处理 token )。

关于c - 嵌套宏中的标记和##,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47530300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com