我只想知道C是否支持超载?当我们使用诸如printf之类的系统函数时,它们的参数个数不同。帮帮我
3 回答
蓝山帝景
TA贡献1843条经验 获得超7个赞
不,C不支持任何形式的重载(除非您将内置运算符已经重载为一种重载形式)。
printf使用称为varargs的功能工作。您拨打的电话看起来可能过载了:
printf("%d", 12); // int overload?
printf("%s", "hi"); // char* overload?
其实不是。只有一个printf函数,但是编译器使用一种特殊的调用约定来调用它,其中您提供的任何参数都按顺序放在stack [*]上。printf(或vprintf)检查格式字符串,并使用该字符串确定如何读回这些参数。这就是为什么printf不是类型安全的原因:
char *format = "%d";
printf(format, "hi"); // undefined behaviour, no diagnostic required.
[*]该标准实际上并没有说它们是通过栈传递的,或者根本没有提到栈,但这是自然的实现。
holdtom
TA贡献1805条经验 获得超10个赞
这完全取决于您如何定义“支持”。
显然,C语言在核心语言中提供了重载的运算符,因为C中的大多数运算符都具有重载的功能:您可以将,和指针类型与二进制+一起使用。intlong
然而,在同一时间C不允许你创建你自己的重载函数和C标准库也有诉诸不同名称的功能与不同类型(如使用abs,fabs,labs等)。
换句话说,C在某种程度上已将重载硬编码到核心语言中,但是标准库和用户都不允许自己进行重载。
- 3 回答
- 0 关注
- 604 浏览
添加回答
举报
0/150
提交
取消