有没有办法告诉gcc在报告错误时不要替换typedef名称和默认参数?

时间:2014-10-25 02:51:27

标签: c++ gcc compiler-errors

例如这段代码:

#include <vector>

template<typename T>
void useVector(T);

using thing = std::vector<int>;

int main()
{
    std::vector<thing> vec;
    useVector(vec);
    return 0;
}

产生过于冗长的消息:

/home/martin/Projects/TestGrounds/main.cpp:11: error: undefined reference to 
`void useVector<std::vector<std::vector<int, std::allocator<int> >, 
std::allocator<std::vector<int, std::allocator<int> > > > 
>(std::vector<std::vector<int, std::allocator<int> >, 
std::allocator<std::vector<int, std::allocator<int> > > >)'

是否有某种方法可以阻止编译器替换所有typedef和默认参数并产生类似的内容:

/home/martin/Projects/TestGrounds/main.cpp:11: error: undefined reference to 
void useVector(std::vector<thing>);

1 个答案:

答案 0 :(得分:1)

根据Eugen Constantin Dinca的建议,我尝试了gccfilter

输出错误减少为:

/tmp/ccEixtdl.o: In function `main':
test.cpp:(.text+0x30): undefined reference to `void useVector<>(std::vector<>)'
collect2: error: ld returned 1 exit status

巨大改进。


首先,您需要下载gccfilter perl script并将其放入$ PATH。然后,您必须安装提到的Perl模块。在Ubuntu下我刚刚做了:

cpan App::cpanminus
cpanm Term::ANSIColor
cpanm Getopt::ArgvFile
cpanm Getopt::Long
cpanm Regexp::Common

您可以将原始问题的源代码保存为test.cpp并运行:

来测试脚本
gccfilter --colorize --remove-template-args g++ -std=c++11 test.cpp

如果使用链接器,则必须使用以下命令运行链接器:

gccfilter --colorize --remove-template-args g++

也是。如果您使用的是qmake,则可以添加:

QMAKE_CXX="gccfilter -c -a g++"
QMAKE_LINK="gccfilter -c -a g++"

到您的.pro文件。对于QtCreator,这会在问题标签中查看错误消息,但您可以在编译输出标签中查看格式化和简化的错误消息。