在C或c++源文件中展开单个宏
Expanding a single macro in C or C++ source files
我有大量的c++源文件,我想通过扩展我指定的单个函数宏来转换它们,而不改变所有其他预处理指令。宏的参数通常涉及父括号、大括号和受父括号保护的逗号,因此使用sed和kin似乎不太直接。
更新:我们的代码大量使用了宏来生成锅炉板(例如swig的helper代码)。当我们更好地弄清楚如何做某些事情时,各种宏不再做任何非常有趣的事情(例如,只是声明一些函数),许多人抱怨它们使代码更难阅读。我想把那些不太有趣的宏扩展成简单的c++代码。
我通过在python中使用正则表达式来完成这些事情。您可以编写一个相当短的脚本来处理大量文件,并在每个文件上运行一些正则表达式。正则表达式可能是最耗时的部分。
我也有类似的需求:摆脱(扩展)那些无用的隐藏原型的宏,这些宏用于处理古老的c89之前的编译器,同时保留其他所有内容。
示例来自<stdio.h>
:
int _EXFUN(vfprintf, (FILE *__restrict, const char *__restrict, __VALIST)
_ATTRIBUTE ((__format__ (__printf__, 2, 0))));
int _EXFUN(vprintf, (const char *, __VALIST)
_ATTRIBUTE ((__format__ (__printf__, 1, 0))));
int _EXFUN(vsprintf, (char *__restrict, const char *__restrict, __VALIST)
_ATTRIBUTE ((__format__ (__printf__, 2, 0))));
int _EXFUN(fgetc, (FILE *));
char * _EXFUN(fgets, (char *__restrict, int, FILE *__restrict));
int _EXFUN(fputc, (int, FILE *));
这里我需要将宏_EXFUN(name,proto)
扩展到name proto
。注意,一些宏调用跨越了不止一行。
解决方案是使用像m4
这样的宏处理器,因为它不知道#include指令和其他宏处理(不像cpp
或gcc -E
):
$ m4 '-D_EXFUN=$1$2' stdio.h
int vfprintf(FILE *__restrict, const char *__restrict, __VALIST)
_ATTRIBUTE ((__format__ (__printf__, 2, 0)));
int vprintf(const char *, __VALIST)
_ATTRIBUTE ((__format__ (__printf__, 1, 0)));
int vsprintf(char *__restrict, const char *__restrict, __VALIST)
_ATTRIBUTE ((__format__ (__printf__, 2, 0)));
int fgetc(FILE *);
char * fgets(char *__restrict, int, FILE *__restrict);
int fputc(int, FILE *);
- 创建
- 用
#undef
填充所有你不想扩展的宏 - 包含
extern int LandMarkSoYouCanFindThis;
作为最后一行 - 每个文件
- 在最后一个包含文件后注入
#include "undef.h"
。 - 通过
cpp
运行文件 - 使用
LandMark
来切断包含 的所有内容
- 在最后一个包含文件后注入
undef.h
文件您可以通过根据#undef
只选择宏和#undef
所有宏之间的差异生成补丁来自动执行最后一步。
相关文章:
- 使用宏计算源文件行?
- 在 Visual Studio 中的 1 个项目中编译单个 C++ 源文件
- C++ 使用宏定义单个类的类成员
- 将多个参数作为单个宏参数传递
- 在C中如何在命令行中定义所有不知道宏(在源文件/标头文件中使用)
- 从命令行定义源文件的宏
- 将某些代码行包装到单个宏中的方法
- 如何禁止显示源文件中特定宏定义的零参数的 GCC 可变参数宏参数警告
- 如何使用 qmake 为单个源文件指定编译器标志
- 如何在大型项目中预处理具有多个 #include 文件的单个源文件
- 在 cmake 中创建一个宏脚本,并在源文件中调用该宏
- 强制与 GCC、Clang 和英特尔编译器中的单个宏内联
- 轻松标记++如何使用单个宏进行配置
- 何时可以使用具有单个标头的多个源文件
- XCode:如何为单个源文件添加预处理器定义
- c++ 从单个源文件转换到多个文件。错误:'blank'未命名类型
- 如何使用gcc使用多个源文件创建单个对象文件
- 将C++文件合并为单个源文件
- 一个宏的重定义可以应用到单个cpp文件吗?
- 在C或c++源文件中展开单个宏