<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>M4 on pemako</title>
    <link>http://pemako.cn/tags/m4/</link>
    <description>Recent content in M4 on pemako</description>
    <image>
      <title>pemako</title>
      <url>http://pemako.cn/images/papermod-cover.png</url>
      <link>http://pemako.cn/images/papermod-cover.png</link>
    </image>
    <generator>Hugo -- 0.146.6</generator>
    <language>en</language>
    <lastBuildDate>Thu, 09 Apr 2026 20:00:00 +0800</lastBuildDate>
    <atom:link href="http://pemako.cn/tags/m4/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>M4 宏处理器</title>
      <link>http://pemako.cn/tools/m4/</link>
      <pubDate>Thu, 09 Apr 2026 20:00:00 +0800</pubDate>
      <guid>http://pemako.cn/tools/m4/</guid>
      <description>&lt;h2 id=&#34;一m4-是什么&#34;&gt;&lt;strong&gt;一、m4 是什么？&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.gnu.org/software/m4/manual/m4.pdf&#34;&gt;&lt;code&gt;GUN m4&lt;/code&gt;&lt;/a&gt;  是一种通用的 &lt;strong&gt;宏处理器（macro processor）&lt;/strong&gt;，最初是 Unix 标准工具的一部分，后来 GNU 也实现了自己的版本（GNU m4）。
它的名字来自 “macro”，设计思想和 C 语言的预处理器（cpp）类似，但更通用、可编程、与语言无关。&lt;/p&gt;
&lt;h3 id=&#34;-简单理解&#34;&gt;&lt;strong&gt;🔧 简单理解：&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;m4 是一个「文本宏展开器」：
它读入文本 → 按定义替换宏 → 输出展开后的文本。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;但 m4 比 C 预处理器灵活得多——它本身是一种“小型解释语言”，带有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宏定义&lt;/strong&gt;与展开机制；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;条件判断&lt;/strong&gt;（ifdef, ifelse）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;循环、递归&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数替换、字符串操作、文件包含&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可生成任意文本（代码、配置、脚本）&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;二m4-解决了什么问题&#34;&gt;&lt;strong&gt;二、m4 解决了什么问题？&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;在 1970–80 年代，Unix 世界里还没有复杂的模板引擎、元编程机制，很多项目要面对：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各种 &lt;strong&gt;平台差异&lt;/strong&gt;（操作系统、编译器特性不同）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重复性代码生成&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置文件或源代码模板&lt;/strong&gt; 需要根据条件生成；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻量级宏系统&lt;/strong&gt; 需要在编译前阶段运行。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;m4 的出现正是为了在「正式编译前」进行灵活的文本层面元编程。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;三历史上最典型的用途&#34;&gt;&lt;strong&gt;三、历史上最典型的用途&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&#34;1-autoconf-系统的基础&#34;&gt;&lt;strong&gt;1️⃣ autoconf 系统的基础&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;这是 m4 最著名的应用场景。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GNU 的 autoconf（用于生成 configure 脚本）本质上就是一堆 .m4 宏定义。&lt;/li&gt;
&lt;li&gt;configure.ac 文件会通过 autoconf → m4 → 生成最终的 configure。&lt;/li&gt;
&lt;li&gt;它负责检测系统特性、生成 Makefile、适配不同环境。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;没有 m4，就没有 autoconf。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
