有没有办法确保代码仅使用std中的名称,而不使用全局名称空间?

时间:2019-07-06 08:53:51

标签: c++

当使用格式为<cname>的标头时,实现会将名称放入std命名空间中。并且{em>也可以将名称也放入全局名称空间,如here所述:

  

[示例:标头肯定在名称空间std中提供其声明和定义。 它也可以在全局名称空间中提供这些名称。 [...] —示例]

是否有一种(可能依赖于编译器的)方式来规避/禁用此行为(我对任何棘手的解决方案持开放态度)?我只想使用std中的名称,并且使用全局命名空间中的名称时会出现错误/警告:

#include <cmath>

double a = cos(0.5); // I'd like to have an error here, because std:: is missing

原因:

  • 如果可移植代码可能使用全局命名空间中的名称,则很难编写可移植代码,因为这些名称在其他编译器中可能不可用。使用std中的所有内容,而根本不使用全局名称空间,会更加干净
  • cos(0.5f)所做的事情与std::是否带前缀不同(floatdouble结果)。

1 个答案:

答案 0 :(得分:1)

因为棘手的解决方案很好...

使用C ++解析器,例如用Clang编写一个分析头文件的工具,收集所有函数定义,然后将其与所有定义进行比较并调用全局函数。

当然,它还会处理某些人定义或调用的函数与标准函数同名的情况,但是您可能还是想避免这种情况。