繁体   English   中英

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

[英]Overriding standard C library functions in C++ program

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

#include <stdio.h>

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

int main() {
printf("\n Hello World\n");
}

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

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

这里不会发生过载。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM