Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:cpp:预处理

C/C++预处理

C语言中的宏


基本上来说,#后面的内容都是由预处理器负责的,但是:

AI: #pragma 是 C 和 C++ 中的一个 预处理指令,用于向编译器传递 特定的指令或选项。虽然 #pragma 出现在预处理阶段(以 # 开头),它不是由预处理器做逻辑决策或代码转换的,而是被编译器在编译阶段解释执行的。预处理器看到 #pragma 通常只是保留它,并在传给编译器时原样保留。

如果一个编译器不识别某个 #pragma,标准规定它应该忽略它而不是报错,除非这个 #pragma 明确影响程序行为(如 #pragma once)。

像#include这种就很简单了,就是在预处理阶段做简单的文本替换

C++预处理器

g++ GNU:预处理器是cpp

clang++ LLVM:Clang++ 的预处理是由 clang++ 内部完成的,不是调用外部独立的预处理程序
预处理的核心代码在 Clang 的源码树中的 clang/Lex 目录下,最主要的类是 clang::Preprocessor

自定义拓展预处理器的功能(clang++)

方式一:修改代码
比较难…可以尝试(关键类是PragmaHandler?)

方式二:编译器插件
Clang 提供了插件机制(FrontendPlugin),可以在不修改 Clang 源码的情况下注册自定义的 pragma handler
https://clang.llvm.org/docs/ClangPlugins.html

方法三:外部工具
比如用Python手写文本替换逻辑

/var/www/DokuWikiStick/dokuwiki/data/pages/程序/cpp/预处理.txt · Last modified: 2025/07/19 18:31 by zhonghui