我正在实现一个C宏预处理器(C99)......
我对以下行为感到惊讶....
练习1:
#define PASTE(x) X_##x #define EXPAND(x) PASTE(x) #define TABSIZE 1024 #define BUFSIZE TABSIZE PASTE(BUFSIZE) EXPAND(BUFSIZE)
扩展为:
X_BUFFSIZE X_1024
练习2:
#define EXPAND(s) TO_STRING(s) #define TO_STRING(s) #s #define FOUR 4 TO_STRING(FOUR) EXPAND(FOUR)
扩展为:
"FOUR" "4"
我已经完成了C的“免费”标准,但我找不到以下内容......
#define
s逐个遇到?答案 0 :(得分:2)
您应该先阅读this page作为初学者。它包含诸如以下的宝石:
C标准规定,在用可能扩展的参数替换任何参数之后,将扫描替换列表以查找嵌套宏。此外,替换列表中在此扫描期间未展开的任何标识符在将来都不再符合扩展条件,如果它们未被扩展的原因是所讨论的宏被禁用。
我认为可以从中推断出没有固定的传递次数:每次发生宏扩展(生成“替换列表”)时,扫描新创建的文本以进行进一步的扩展。这是一个递归过程。
答案 1 :(得分:1)
实际上预处理器执行了多少次传递?
# PARAMETER
的所有出现次数##
的令牌它首先替换一个宏,然后替换其他宏等,或者它是否存储 &安培;将它们替换为#defines一个接一个地遇到?
它按照程序文本中遇到的顺序替换宏,或者如上所述在递归替换期间替换宏。
首先是文件包含还是宏扩展?
如果#include
的参数不包含在<>
或""
中,则会扩展<>
的参数。那么必须导致""
或{{1}}