Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重写C+中的标准C库函数+;程序_C++ - Fatal编程技术网

C++ 重写C+中的标准C库函数+;程序

C++ 重写C+中的标准C库函数+;程序,c++,C++,我想知道编译器/链接器如何从可用的2个printf函数中进行选择。一个是用户定义的,另一个是标准的c库实现 #include <stdio.h> int printf(const char* c, ...) { return 0; } int main() { printf("\n Hello World\n"); } #包括 int printf(const char*c,…){ 返回0; } int main(){ printf(“\n Hello World\n”);

我想知道编译器/链接器如何从可用的2个printf函数中进行选择。一个是用户定义的,另一个是标准的c库实现

#include <stdio.h>

int printf(const char* c, ...) { 
return 0;
}

int main() {
printf("\n Hello World\n");
}
#包括
int printf(const char*c,…){
返回0;
}
int main(){
printf(“\n Hello World\n”);
}
我知道什么是重载,但这里两个实现都有相同的签名。基本上,我不理解函数的这个概念。
这是否违反了ODR?这是一个定义良好的C++程序,还是在某些平台上有UB?p> 程序具有未定义的行为,因为它在保留上下文中定义了名称。C++17标准草案中的一个条款规定,来自C标准库的具有外部链接的函数签名是保留的,并指出在保留上下文中定义名称会导致未定义的行为。

重写与重载是完全不同的概念。 重写虚拟成员函数

这里不会发生过载


实际情况是,您使用与stdio.h声明完全相同的签名来定义
printf
。所以它是相同的函数(使用“C”链接!)。您只是提供了它的定义。定义标准库函数是不明确的行为,除了那些明确地被称为“用户可替换”的函数。

@马立克R与重载不同,这不是超载,C++允许您通过实现派生的替代来重写成员函数。C没有。C++中的@ VisalSaMARMA“重写”是指派生类中虚拟成员函数的重写。全局函数只有“重载”和“替换”。只有在非常特定的情况下才能“替换”功能,即使用
运算符new
运算符delete
,请参见查找弱符号的概念。它不是标准C++的一部分。内置的
printf
是“弱的”,所以链接器会用你的函数覆盖它。从你的回答中,我知道这既不是重载也不是重写,对吗?链接器如何忽略标准库中的定义?printf是被称为用户可替换的功能之一吗?有多少这样的函数?@VishalSharma Unix链接器通常会忽略库中(但不是对象中)的多个定义。Printf不可由用户替换。AFAIR仅提供“操作员新建”和
操作员删除
的变体。