我有一个简短的问题。有没有一种方法可以强制标准名称空间具有std::
作用域限定符?类似abs
之类的东西;所有std
函数都必须定义其范围。
我既不在using namespace std
也不在using std::abs
之类的地方。可能要说我包含Windows.h
可能很重要,我认为这可能是其中一些不受范围限制的函数的来源。
答案 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 ++标头中,这会产生后勤上的噩梦。