任何人都可以在下面的例子中解释C预处理器的行为吗?

时间:2013-03-15 10:46:49

标签: c macros c99 c-preprocessor

我正在实现一个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的“免费”标准,但我找不到以下内容......

  1. 实际上预处理器执行了多少次传递?
  2. 首先替换一个宏,然后替换其他宏等等
  3. 或存储&将它们替换为#define s逐个遇到?
  4. 首先是文件包含还是宏扩展?

2 个答案:

答案 0 :(得分:2)

您应该先阅读this page作为初学者。它包含诸如以下的宝石:

  

C标准规定,在用可能扩展的参数替换任何参数之后,将扫描替换列表以查找嵌套宏。此外,替换列表中在此扫描期间未展开的任何标识符在将来都不再符合扩展条件,如果它们未被扩展的原因是所讨论的宏被禁用。

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

答案 1 :(得分:1)

  

实际上预处理器执行了多少次传递?

  1. 它通过该参数的字符串化取代# PARAMETER的所有出现次数
  2. 它加入所有中间有##的令牌
  3. 它用值
  4. 替换参数的所有剩余次数
  5. 以递归方式扩展替换文本以显示其他宏的出现。 (宏本身在这些递归调用中被阻止。)
  6.   

    它首先替换一个宏,然后替换其他宏等,或者它是否存储   &安培;将它们替换为#defines一个接一个地遇到?

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

      

    首先是文件包含还是宏扩展?

    如果#include的参数不包含在<>""中,则会扩展<>的参数。那么必须导致""或{{1}}

    中的某些内容