1

我正在实现一个 C 宏预处理器(C99)......

我对以下行为感到惊讶....

例1:

#define PASTE(x) X_##x
#define 扩展(x)粘贴(x)
#define TABSIZE 1024
#define BUFSIZE TABSIZE

粘贴(BUFSIZE)
扩展(BUFSIZE)

扩展为:

X_BUFFSIZE
X_1024

例 2:

#define EXPAND(s) TO_STRING(s)
#define TO_STRING(s) #s
#定义四个 4

TO_STRING(四)
展开(四)

扩展为:

“四”
“4”

我已经通过了 C 的“免费”标准,但我找不到以下内容......

  1. 实际上预处理器执行了多少遍?
  2. 它是否先替换一个宏然后再替换另一个等等
  3. 或者它是否存储并替换它们,因为它们#define是一一遇到的?
  4. 是先包含文件还是先进行宏扩展?
4

2 回答 2

2

对于初学者,您应该阅读此页面。它包含宝石,例如:

C 标准规定,在将任何参数替换为其可能扩展的参数之后,将扫描替换列表以查找嵌套宏。此外,如果替换列表中未扩展的任何标识符在此扫描期间未扩展,则将来不再有资格进行扩展,如果它们未扩展的原因是相关宏已禁用。

我认为可以从中推断出没有固定的传递次数:每次发生宏扩展(生成“替换列表”)时,都会扫描新创建的文本以进行进一步的扩展。这是一个递归过程。

于 2013-03-15T10:50:16.280 回答
1

实际上预处理器执行了多少遍?

  1. # PARAMETER它通过该参数的字符串化替换所有出现的
  2. 它加入了所有中间的##令牌
  3. 它用参数的值替换所有剩余的参数
  4. 它递归地扩展出现其他宏的替换文本。(宏本身在这些递归调用中被阻塞。)

它是先替换一个宏然后再替换另一个等等,还是在遇到#defines时存储并替换它们?

它按照在程序文本中遇到宏的顺序或在上述递归替换期间替换宏。

是先包含文件还是先进行宏扩展?

首先,如果 an 的参数#include不包含在<>or中包含的内容中,则它会被扩展""。那一定会导致确切地说某物在里面<>或里面""

于 2013-03-15T12:32:51.190 回答