编译器对不必要的命名空间发出警告
Compiler Warning for Unnecessary Namespaces
我有很多功能类似的代码:
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个文件中)出现误报(由于假预处理的限制)。
我希望这能帮助未来的某个人!看看吧!
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- 是否有 GCC 警告,用于使用 C 库中的符号而不是通过命名空间 std?
- 如何处理警告 C4177:#pragma 'float_control' 只能在全局范围或命名空间范围内使用
- 为命名空间中的类重载运算符<<时发出警告
- 编译器对不必要的命名空间发出警告
- 如何为匿名命名空间中未引用的本地函数生成警告
- 警告:不同命名空间中的模板专用化