C++ C++;是否还保留标准库函数名?

C++ C++;是否还保留标准库函数名?,c++,function,C++,Function,假设您在翻译单元中定义了一个函数,该函数的名称与任何标准库函数完全匹配。 由于编译器首先在翻译单元中查找定义,然后在库文件中查找定义,因此这会导致使用自己版本的函数定义,还是会导致诊断 我不确定我是否正确理解了这个问题(如果我错了,请纠正我),但可以说您有这样一个函数: void sort( // blah blah 或者使用命名空间std声明std命名空间 在翻译单元内调用sort(…)时,编译器会重载定义,在这种情况下,函数具有优先级 但是如果您通过显式定义std名称空间(使用范围解析操作

假设您在翻译单元中定义了一个函数,该函数的名称与任何标准库函数完全匹配。
由于编译器首先在翻译单元中查找定义,然后在库文件中查找定义,因此这会导致使用自己版本的函数定义,还是会导致诊断

我不确定我是否正确理解了这个问题(如果我错了,请纠正我),但可以说您有这样一个函数:

void sort( // blah blah
或者使用命名空间std声明std命名空间

在翻译单元内调用
sort(…)
时,编译器会重载定义,在这种情况下,函数具有优先级

但是如果您通过显式定义std名称空间(使用范围解析操作符)调用标准库函数,如下所示


它将改用std库函数。

我不确定我是否正确理解了这个问题(如果我错了,请纠正我),但可以说您有这样一个函数:

void sort( // blah blah
或者使用命名空间std声明std命名空间

在翻译单元内调用
sort(…)
时,编译器会重载定义,在这种情况下,函数具有优先级

但是如果您通过显式定义std名称空间(使用范围解析操作符)调用标准库函数,如下所示


它将使用std库函数。

否,命名空间
std
内函数的名称不保留-至少在命名空间
std
外使用相同名称是禁止的

但是,将名称放在名称空间
std
(少数情况除外,例如专门指定某些模板函数)中会产生未定义的行为


如果编译器在调用函数时抱怨模棱两可,其中一个函数与您的函数同名,但位于命名空间
std
,那么原因可能是代码中使用命名空间std
。当编译器遇到一个名称时,其效果是,您的函数和命名空间
std
中的函数都是有效的匹配项。如果编译器没有理由选择其中一个而不是另一个(例如,它们接受相同类型的参数),代码将不会编译。在这种情况下,解决方案是从代码中删除
使用名称空间std
——除了删除它之外,无法撤消
使用名称空间std
的效果。

否,名称空间
std
中的函数名不保留——至少,不是说禁止在命名空间
std
之外使用相同的名称

但是,将名称放在名称空间
std
(少数情况除外,例如专门指定某些模板函数)中会产生未定义的行为


如果编译器在调用函数时抱怨模棱两可,其中一个函数与您的函数同名,但位于命名空间
std
,那么原因可能是代码中使用命名空间std
。当编译器遇到一个名称时,其效果是,您的函数和命名空间
std
中的函数都是有效的匹配项。如果编译器没有理由选择其中一个而不是另一个(例如,它们接受相同类型的参数),代码将不会编译。在这种情况下,解决方案是从代码中删除
使用名称空间std
——除了删除它之外,没有其他方法可以撤销
使用名称空间std
的效果。

这就是人们说
使用名称空间std是一个很差的练习。
因为当您使用已在
命名空间std
中定义的相同函数名时,函数定义会发生冲突,从而导致许多不相关的错误

有关更多详细信息,请阅读此线程:-


这就是为什么人们说
使用名称空间std是一个很差的练习。
因为当您使用已在
命名空间std
中定义的相同函数名时,函数定义会发生冲突,从而导致许多不相关的错误

有关更多详细信息,请阅读此线程:-


这听起来像是使用
名称空间std的症状。如果您使用自己的名称空间,您可以重用stl函数名。e、 g.
mynamespace{ostream&cout(String str)…}
。然后,您可以使用作用域解析运算符(::)使用名称空间来指定要使用“完全匹配”的cout,就像在
std
名称空间中引入新符号一样?§17.6.4.2.1明确禁止这种行为:“如果程序向名称空间
std
添加声明或定义,则程序的行为是未定义的。”。但是,您可以在用户类型上专门化模板。如果您使用自己的名称空间,您可以重用stl函数名。e、 g.
mynamespace{ostream&cout(String str)…}
。然后,您可以使用作用域解析运算符(::)使用名称空间来指定要使用“完全匹配”的cout,就像在
std
名称空间中引入新符号一样?§17.6.4.2.1明确禁止这种行为:“如果程序向名称空间
std
添加声明或定义,则程序的行为是未定义的。”。但是,您可以对用户类型专门化模板。@HolyBlackCat我不知道为什么
putchar
会有这种行为,但对我来说,您的代码不应该工作,请参阅。标准库没有特殊的优先级。如果从
std
中提取
排序
,并使用名称空间std
使用
,并且还有一个名为<