Ste*_*sop 47
不,C不支持任何形式的重载(除非你计算内置运算符已经过载的事实,作为一种重载形式).
printf
使用名为varargs的功能.您进行看似可能重载的调用:
printf("%d", 12); // int overload?
printf("%s", "hi"); // char* overload?
Run Code Online (Sandbox Code Playgroud)
实际上并非如此.只有一个printf函数,但编译器使用一个特殊的调用约定来调用它,其中你提供的任何参数都按顺序放在堆栈[*]上.printf(或vprintf)检查格式字符串并使用它来确定如何读取这些参数.这就是printf不是类型安全的原因:
char *format = "%d";
printf(format, "hi"); // undefined behaviour, no diagnostic required.
Run Code Online (Sandbox Code Playgroud)
[*]标准实际上并没有说它们是在堆栈上传递,或者根本没有提到堆栈,但这是自然的实现.
这一切都取决于你如何定义"支持".
很显然,C语言提供重载运算核心语言中,因为使用C大多数运营商都重载功能:你可以使用二进制+
有int
,long
并用指针类型.
然而,在同一时间C不允许你创建你自己的重载函数和C标准库也有诉诸不同名称的功能与不同类型(如使用abs
,fabs
,labs
等).
换句话说,C将某种程度的重载硬编码到核心语言中,但标准库和用户都不允许自己进行重载.
小智 5
不,C不支持重载.如果要实现类似于C++的重载,则必须使用某种一致的约定手动修改函数名称.例如:
int myModule_myFunction_add();
int myModule_myFunction_add_int(int);
int myModule_myFunction_add_char_int(char, int);
int myModule_myFunction_add_pMyStruct_int(MyStruct*, int);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
29931 次 |
最近记录: |