C支持重载吗?

J.K*_*ery 56 c

我只是想知道C是否支持过载?因为我们使用像printf这样的系统函数,它们具有不同的参数.帮帮我

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)

[*]标准实际上并没有它们是在堆栈上传递,或者根本没有提到堆栈,但这是自然的实现.


Ken*_*Ken 29

C不支持重载.(显然,即使它确实如此,他们也不会将它用于printf:你需要为每种可能的类型组合使用printf!)

printf使用varargs.


cod*_*ict 22

不,C不支持重载,但它确实支持Variadic功能.printf是Variadic函数的一个例子.


AnT*_*AnT 8

这一切都取决于你如何定义"支持".

很显然,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)