假设您在翻译单元内定义了一个函数,其函数名称与任何标准库函数完全匹配。 由于编译器首先在转换单元中查找定义,然后在库文件中查找定义,因此这会导致使用自己版本的函数定义还是会导致诊断?
答案 0 :(得分:2)
我不确定我是否正确理解了这个问题(如果我错了,请纠正我)但是说你有这样的功能:
void sort( // blah blah
或声明标准名称空间using namespace std
(which you should not be doing)
当您在翻译单元中调用sort(...)
时,编译器会重载定义,在这种情况下,您的函数优先。
但是如果你通过显式定义std命名空间(使用范围解析运算符)来调用标准库函数,那么
std::sort( // blah blah
它将使用std库函数。
答案 1 :(得分:2)
不,名称空间std
中的函数名称不会被保留 - 至少,不会禁止在名称空间std
之外使用相同的名称。
但是,在名称空间std
中放置名称(在少数情况下除外,例如专门化某些模板函数)会产生未定义的行为。
如果您在调用函数时让编译器抱怨歧义,其中一个函数与您的函数名称相同但名称空间为std
,则原因可能是using namespace std
你的代码。当编译器遇到名称时,其效果是您的函数和名称空间std
中的函数都是有效匹配。如果编译器没有理由优先于另一个(例如,它们接受相同类型的参数),则代码将无法编译。在这种情况下,解决方案是从代码中删除using namespace std
- 除了删除using namespace std
之外,无法撤消LocalDate
的影响。
答案 2 :(得分:0)
这就是为什么人们说C ++中的using namespace std;
是一种不好的做法。
因为当您使用已在namespace std
中定义的相同函数名称导致许多不相关的错误时,函数定义会发生冲突。
阅读此主题以获取更多详细信息: -
Why using namespace std; in C++ is considered a bad practice?