编译器对不必要的命名空间发出警告

Compiler Warning for Unnecessary Namespaces

本文关键字:警告 命名空间 不必要 编译器      更新时间:2023-10-16

我有很多功能类似的代码:

namespace Foo { namespace Bar { namespace Baz {
class MyType {};
Foo::Bar::Baz::MyType func(Foo::Bar::Baz::MyType const& param);
}}}

由于MyType的定义没有任何冲突,因此可以很容易地简化为:

namespace Foo { namespace Bar { namespace Baz {
class MyType {};
MyType func(MyType const& param);
}}}

通过开始删除我们庞大、扩展的代码库中出现的这类内容,我们节省了(令人尴尬的数量)文本空间。然而,由于我们是通过vgrep进行的,所以它运行缓慢且容易出错。

理想情况下,会出现编译器警告。我们的代码库在三个不同的平台(Windows、Linux和Mac)上分别支持三种不同的编译器(MSVC、g++和Clang)。

我找不到一个可以帮助我们的警告,而且很难用谷歌搜索,因为人们经常犯class A { void A::method(void) {} };错误(g++发现了这一点,因为它不符合标准)。我们的问题是命名空间的过度限定,而不是类型

那么,我应该在(至少)上面的一个编译器中启用什么警告?还有其他解决方案吗?

好吧,我自己写了。

我在github上为它做了一个存储库,在这里。这是对我为类似代码质量任务(复杂性较低)使用的一些旧脚本的重构/概括。

我最初尝试将它建立在CPIP的基础上,但我发现它有点bug,而且速度太慢了。相反,目前的版本是基于一个速度极快的自制lexer(但实际上不是一个预处理器)。这确实会导致一些限制和误报,这些都是有记录的。

然而,原型对我们来说非常成功。我们能够在几个小时内删除所有遗漏的cruft,只有4个文件(829个文件中)出现误报(由于假预处理的限制)。

我希望这能帮助未来的某个人!看看吧!