提问者:小点点

使用clang或G++/GCC打印预处理后的代码,而不包括来自系统路径的文件


当前我想调试我的包含。 为此,我希望得到预处理后的代码,但不需要任何系统头文件--只需要我自己的代码。

我用“-e”“-nostdinc”标记进行了尝试。 但是我会得到错误,例如丢失。 如何禁用这类预处理错误?


共3个答案

匿名用户

如何禁用这类预处理错误?

您可以创建一组标题文件,其名称与标准库标题匹配。 将这些头放在include目录中。 让文件为空。

使用clang或G++/GCC打印预处理后的代码,而不包括来自系统路径的文件

除了空报头方法之外,我还可以看到另外两种方法:

>

  • 不要使用编译器的完整预处理器,而是编写您自己的只执行所需处理子集的预处理器。

    或者,编写一个后预处理器,从预处理结果中移除标准头内容。

  • 匿名用户

    使用clang或G++/GCC打印预处理后的代码,而不包括来自系统路径的文件

    这在GCC中是不容易实现的。 阅读有关如何调用gcc的内容。

    但是您可以使用g++-c-e获取所有预处理后的代码,并使用一些脚本(可能与GNU gawk一起使用)来删除无用的部分。 例如,请参见RefPerSys

    当前我想调试我的包含。

    我有一个习惯,就是生成所有的预处理代码,然后少用GNU看看里面。 磁盘空间很便宜。

    或者,考虑编写您自己的GCC插件来做您需要的事情。

    匿名用户

    (算不上真正的答案--只是一个“黑客”)

    为了解决这个问题,我创建了一个包含所有系统头的文本文件,方法是:

    rem my GCC STL-PATH
    cd Z:\usr\include\c++\10
    
    dir /b > F:\DummySTL\files.txt
    

    然后我执行了以下代码行:

    for /f "delims=" %F in (files.txt) do copy nul "%F"
    

    这将为文件中的每一行创建一个空文本文件。 现在我可以调用gcc或clang,只需使用:

    -isystem"F:\DummySTL"
    

    相关问题


    MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(clang|g++|gcc|打印|预处理|代码|不包括|系统|路径|文件)' ORDER BY qid DESC LIMIT 20
    MySQL Error : Got error 'repetition-operator operand invalid' from regexp
    MySQL Errno : 1139
    Message : Got error 'repetition-operator operand invalid' from regexp
    Need Help?