如何只处理 C/C++ 项目中的宏而不编译它?
How to only process the macros in a C/C++ project without compiling it?
我正在尝试审查一个 C/C++ 项目,该项目大量处理宏和类似函数的宏。我想做的是用它们的替换替换 define
和类似函数的宏。
例如我有这个文件:
#include <iostream>
#define SUM(a,b,c,d) a+b+c+d
using namespace std;
int main(){
cout << SUM(1,2,3,4) << endl;
}
我想访问这个文件:
#include <iostream>
using namespace std;
int main(){
cout << 1+2+3+4 << endl;
}
请注意,我不打算替换 #include
行。
编辑:
gcc -E
扩展了 #define
宏,但它也会扩展 #include
宏。我不想扩展 #include
。
GCC 有 -E 标志,这使得它输出预处理的源代码。
使用 gcc -E 预处理您的源文件。然后在所有 #include 之后找到原始源文件的第一行,并删除第一行之前的所有行。然后从原始源文件中恢复#include。
预处理器为调试器标记原始源代码行,如下所示,因此您可以在#include 之后轻松找到正确的原始第一行。
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "main.c"
我以前用过gcc -nostdinc -E ...
(或类似的东西)。
暂时无法测试;也不太记得我为什么使用它
我正在尝试审查一个 C/C++ 项目,该项目大量处理宏和类似函数的宏。我想做的是用它们的替换替换 define
和类似函数的宏。
例如我有这个文件:
#include <iostream>
#define SUM(a,b,c,d) a+b+c+d
using namespace std;
int main(){
cout << SUM(1,2,3,4) << endl;
}
我想访问这个文件:
#include <iostream>
using namespace std;
int main(){
cout << 1+2+3+4 << endl;
}
请注意,我不打算替换 #include
行。
编辑:
gcc -E
扩展了 #define
宏,但它也会扩展 #include
宏。我不想扩展 #include
。
GCC 有 -E 标志,这使得它输出预处理的源代码。
使用 gcc -E 预处理您的源文件。然后在所有 #include 之后找到原始源文件的第一行,并删除第一行之前的所有行。然后从原始源文件中恢复#include。
预处理器为调试器标记原始源代码行,如下所示,因此您可以在#include 之后轻松找到正确的原始第一行。
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "main.c"
我以前用过gcc -nostdinc -E ...
(或类似的东西)。
暂时无法测试;也不太记得我为什么使用它