通过标准输入编译GCC代码,如何使诊断信息格式与编译文件一致?
GCC标准输入编译时启用完整诊断信息格式
要让GCC从标准输入编译时输出和普通文件编译一致的诊断信息(含错误代码行及脱字符^,且文件名显示为<stdin>),可以通过以下方案实现,无需临时文件:
核心解决方案
将输入目标从-改为/dev/stdin,同时可选添加路径映射选项让文件名显示为<stdin>:
基础版(文件名显示为/dev/stdin)
gcc -xc -o output /dev/stdin <<< "int main() { return }"
输出示例:
/dev/stdin:1:16: error: expected expression before ‘}’ token
int main() { return }
^~~~~
优化版(文件名显示为<stdin>)
添加-ffile-prefix-map选项替换诊断信息中的文件名:
gcc -xc -o output /dev/stdin -ffile-prefix-map=/dev/stdin=<stdin> <<< "int main() { return }"
输出示例:
:1:16: error: expected expression before ‘}’ token
int main() { return }
^~~~~
原理说明
GCC默认处理-(标准输入)时采用流式读取,不会缓存输入内容,因此无法回溯输出错误代码行。而使用/dev/stdin作为输入路径时,GCC会将其当作普通文件读取完整内容并缓存,从而支持生成包含代码行和脱字符的诊断信息。-ffile-prefix-map则用于替换诊断信息中的文件名,满足显示<stdin>的需求。
内容的提问来源于stack exchange,提问作者Kresimir
相关产品推荐
相关产品推荐

