C宏处理

标签 c macros c-preprocessor kernighan-and-ritchie

我正在考虑编写 C 定义能够处理宏的处理器的最佳方法。不幸的是,我没有想到任何聪明的东西。 它的行为应该与 C 中的完全一样,因此它处理这样的表达式:

#define max(a, b) (a > b ? a : b)

 printf("%d\n", max(a, b));

或者这个:

#define F 10
#define max(a, b) (a > b ? a : b)

 printf("%d\n", max(a, F));

我知道 K&R2 的安装和查找功能,我还需要什么 替换括号内的文本? 有没有人有任何建议或一些伪代码? 我知道这是一项复杂的任务,但最好的方法是什么?

最佳答案

宏处理器非常有趣,但可能会变成难以驯服的野兽(例如,想想递归扩展)。

您可以查看现有宏处理器的实现,例如 M4 (http://www.scs.stanford.edu/~reddy/links/gnu/m4.pdf)。

一般来说,您需要:

  • 首先从您的文件中提取宏定义的解析器(当然是从文件中删除它们)
  • 另一个解析器,用于识别需要扩展宏的位置并执行扩展(例如,您将要跳过字符串和注释!)

我认为这是一个非常有趣的练习。处理所有这些问题的适当数据结构并非易事。

关于C宏处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1740262/

相关文章:

C++ 元编程

c - 'printf'原理

你能为条件编译定义一个函数风格的宏吗?

c - scanf() - 获取字段计数并检查 EOF

c - 基本 C 位运算示例

c - 使用 CryptoAPI 将 UTF8String 编码为 ASN1

使用 ## 和 __LINE__ 创建 C 宏(与定位宏的标记串联)

c++ - 优化 : . cpp 或 .obj/.o 或 .lib/.a

c - 这种宏观论证计数策略是否合法?

c - C 预处理器指令的 Lex 规则