如何只处理C/C++项目中的宏而不编译它?

如何只处理C/C++项目中的宏而不编译它?,c++,c,gcc,g++,C++,C,Gcc,G++,我试图回顾一个C/C++项目,该项目大量处理宏和类似宏的函数。我想做的是用宏的替换来替换define和function-like宏 例如,我有一个文件: #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> usin

我试图回顾一个C/C++项目,该项目大量处理宏和类似宏的函数。我想做的是用宏的替换来替换define和function-like宏

例如,我有一个文件:

#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 <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标志,用于输出预处理的源代码。

使用GCC-E预处理源文件。然后找到原始源文件的第一行,包括并删除第一行之前的所有行。然后从原始源文件还原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-E预处理源文件。然后找到原始源文件的第一行,包括并删除第一行之前的所有行。然后从原始源文件还原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-nostinc-E。。。或者类似的事情

目前无法测试这一点;我也不记得我为什么用它了

我用了gcc-nostinc-E。。。或者类似的事情


目前无法测试这一点;我也记不清我为什么使用它了

也许这会有帮助:@FiddlingBits它不会直接帮助这种情况,因为它也会扩展include。@MikeCAT您可以先删除包含的所有行,然后编译它。目前建议的重复项不正确,因为这个问题要求展开用define定义的宏,而不是处理include语句。我认为GCC没有这方面的开关。你可以创建一个源文件的副本,其中包含行被修改以抑制它们,然后使用GCC,然后恢复包含行。未测试-我想我以前用过这个-GCC-no stdinc-E。。。或者类似的东西,也许这会有帮助:@FiddlingBits它不会直接帮助这种情况,因为它也会扩展include。@MikeCAT您可以先删除包含的所有行,然后编译它。到目前为止建议的重复项是不正确的,因为这个问题要求展开用define定义的宏,而不是处理include语句。我认为GCC没有这方面的开关。你可以创建一个源文件的副本,其中包含行被修改以抑制它们,然后使用GCC,然后恢复包含行。未测试-我想我以前用过这个-GCC-no stdinc-E。。。或者类似的事情这是不正确的,因为gcc-E做了完整的预处理,包括定义和包含指令,但问题是不要处理包含指令。我同意。我误解了。如果您不必检查输出中附加的include的音调,-E标志可能仍然有用。我不相信有任何现成的解决方案可以满足OP的需求。这是不正确的,因为gcc-E会进行完整的预处理,包括定义和包含指令,但问题是不要处理包含指令。我同意。我误解了。如果您不必检查输出中附加的include的音调,-E标志可能仍然有用。我不相信有任何现成的解决方案,像这样的OP需要什么。