覆盖程序中的标准 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 Worldn");
}
我知道什么是重载,但在这里两个实现具有相同的签名。基本上我不明白这种"覆盖">函数的概念。 这是否以某种方式违反了 ODR?这是一个定义明确的C++程序,还是在某些平台上可以有UB?
覆盖与重载是一个完全不同的概念。 覆盖虚拟成员函数。
这里不会发生重载。
实际发生的情况是,您正在定义printf
与stdio.h
声明完全相同的签名。所以它是相同的功能(带有"C"链接!你只是在提供它的定义。定义标准库函数是未定义的行为,但明确提及为用户可替换的函数除外。
程序具有未定义的行为,因为它在保留上下文中定义了一个名称。C++17 标准草案的 [extern.names]/4 指出,具有来自 C 标准库的外部链接的函数签名是保留的,[reserved.names]/2 表示在保留上下文中定义名称会导致未定义的行为。
相关文章:
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 有没有一个 c++ gmp 库函数与 python gmpy2 库 divm(..) 函数相同?
- 好友库函数可以访问子数据
- 覆盖程序中的标准 C 库函数C++
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 返回time()库函数的数据类型
- 将C++中的多个参数传递给MatLab共享库函数
- 从另一个动态链接库项目调用静态库函数
- 导入的库函数是否可以在内存中移动
- 带参数的线程调用库函数
- 在 MASM 中调用标准库函数
- char concat c++ 没有库函数
- 为什么C++ std::min_element 库函数接受采用布尔返回类型的函数对象的函子,而不是像 C 中那样的 in
- 如何在将指针传递给库函数时处理内存管理
- 使库函数模板化以避免编译器指令是否有益?
- 结构被库函数覆盖
- 如何在标准库C/C++函数中进行gdb单步执行操作
- 如何从 c++ 调用动态库函数
- 标准库函数 abs() 在不同C++编译器上的异常行为