覆盖程序中的标准 C 库函数C++

Overriding standard C library functions in C++ program

本文关键字:库函数 C++ 标准 程序 覆盖      更新时间:2023-10-16

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

#include <stdio.h>
int printf(const char* c, ...) { 
return 0;
}
int main() {
printf("n Hello Worldn");
}

我知道什么是重载,但在这里两个实现具有相同的签名。基本上我不明白这种"覆盖">函数的概念。 这是否以某种方式违反了 ODR?这是一个定义明确的C++程序,还是在某些平台上可以有UB?

覆盖与重载是一个完全不同的概念。 覆盖虚拟成员函数

这里不会发生重载。

实际发生的情况是,您正在定义printfstdio.h声明完全相同的签名。所以它是相同的功能(带有"C"链接!你只是在提供它的定义。定义标准库函数是未定义的行为,但明确提及为用户可替换的函数除外。

程序具有未定义的行为,因为它在保留上下文中定义了一个名称。C++17 标准草案的 [extern.names]/4 指出,具有来自 C 标准库的外部链接的函数签名是保留的,[reserved.names]/2 表示在保留上下文中定义名称会导致未定义的行为。