C中的运算符重载

6

在C++中,我可以通过以下方式更改特定类上的运算符:

MyClass::operator==/*Or some other operator such as =, >, etc.*/(Const MyClass rhs) {
    /* Do Stuff*/;
}

但是在C语言中没有(默认情况下)内置的类。那么,我如何为一般函数进行运算符重载呢?

例如,如果我记得正确的话,导入stdlib.h会给你提供->运算符,它只是(*struct_name).struct_element的语法糖。

那么我该如何在C语言中实现这个功能呢?

谢谢。


我不确定你说“没有默认内置类”意味着什么,但是在C语言中根本就没有类。无论是内置的还是其他方式实现的都没有。而且你所说的函数运算符重载是什么意思?这毫无意义。 - user229044
你可以使用类在C中创建对象模型,但是除了纯C语法之外,它将不会使用其他语法。关于我的尝试,请参见http://jonsterling.github.com/2009/08/28/implementing-object-oriented-programming-in-pure-c.html和http://jonsterling.github.com/2009/09/07/object-oriented-programming-in-c-mark-two.html。 - Jonathan Sterling
乔纳森对我所遭受的痛苦有正确的直觉。我是在说你可以将C语言强制转换为面向对象编程模型。 - Leif Andersen
4个回答

15

在任何形式下,纯C都没有运算符重载功能。使用-> "运算符"来访问指针成员是标准C语言的一部分,不需要引入任何头文件。


确实。->只是特殊的语法,因为指向结构体的指针非常常见。 - avpx
我明白了。所以,基本上,唯一一种类型的操作符重载就是某种预处理器指令,比如: #define plus(a,b) a+b。虽然这样做不允许任何形式的参数,除非你可以将a和b改为实际的参数名... - Leif Andersen
5
@Leif:我认为宏并不适合你所说的情况。如果你想让“struct foo”具有某种加法概念,那么通常会定义一个函数“foo add_foos(foo lhs, foo rhs)”或类似的内容。没有必要让预处理器介入此过程。如果以后转换到C ++,则可以重载“+”以调用“add_foos”。 - Mark Rushakoff

5

C语言中的内置运算符是重载的。你可以使用二进制+来对整数、浮点数进行求和,并执行指针算术运算,这是一个经典的运算符重载示例。

然而,在C中没有用户级别的运算符重载功能。你无法定义自己的运算符。


1

-> 结构体指针解引用运算符是 C 语言规范的一部分,stdlib.h 不会影响它。


老鼠,好的,谢谢。我记得我大学时有个研究生告诉过我这件事。 - Leif Andersen
不要相信一个研究生对一种语言有任何了解,除非他自己写过实现。 :) - greyfade

1
当然,你不能在C语言中重载运算符。 “->”运算符是C语言的一部分,不需要#include。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接