强制标准命名空间的命名空间范围

时间:2019-02-21 04:04:42

标签: c++ windows

我有一个简短的问题。有没有一种方法可以强制标准名称空间具有std::作用域限定符?类似abs之类的东西;所有std函数都必须定义其范围。

我既不在using namespace std也不在using std::abs之类的地方。可能要说我包含Windows.h可能很重要,我认为这可能是其中一些不受范围限制的函数的来源。

3 个答案:

答案 0 :(得分:2)

该标准不允许其他命名空间具有名为abs的函数,只是因为abs命名空间中有名为std的函数。 std命名空间中定义的所有其他函数都是如此。

如果要确定使用std::abs。而不是abs的任何其他版本,则一定要使用std::abs。然后,abs头文件中是否定义了其他版本的windows.h并不重要。

答案 1 :(得分:0)

调用abs而不是std::abs只是在使用abs from C

答案 2 :(得分:0)

C ++中的规则是#include <cmath>abs的声明放入命名空间std中,并且允许也将{{1 }}。

C ++中的另一条规则是abs#include <math.h>的声明放入全局名称空间,并且允许也将abs的声明放入命名空间abs

因此,不,您不能假设std不会将#include <cmath>放入全局名称空间。

之所以使用此规则,不是因为abs仅将名称放在#include <cmath>中的“明显”规则的原因是,如果C ++实现者也没有控制权,则后一个规则可能难以实现在C标头中。在这种情况下,C ++标头必须对所有C函数都具有重复的声明,并且对C标头的任何更改都必须保留到C ++标头中,这会产生后勤上的噩梦。