运算符’重载’等效于C / Objective-C中的#define

可能重复:
运算符在C中重载

如果我有一个结构:

typedef struct myStruct { ... } myStruct; myStruct myStructAdd(myStruct a, myStruct b); 

我需要这样的东西:

 #define myStruct a + myStruct b myStructAdd(a, b) // NOTE this code does NOT WORK. This is what the question is asking. 

要使此语法有效:

 myStruct a; myStruct b; myStruct c = a + b; 

有没有办法使用#define来做到这一点?

编辑:

我不是要求+语法的替代品。 我要问的是,是否以及如何使用预处理器在编译时将plus语法重写为标准C语法。

例如#define myStruct a + myStruct b myStructAdd(a, b) ,它在编译时将myStructA + myStructB转换为myStructAdd(myStructA, myStructB)

运算符重载不是C或Objective-C的特性。 C ++允许您为运算符和自定义类型定义任意行为。 在Objective-C中,如果可以将两个对象一起添加,那么通常有一种方法:

 Foo *result = [foo1 fooByAddingFoo:foo2]; 

或者,如果该类是可变的:

 Foo *foo1 = [Foo fooWithBar:bar]; [foo1 addFoo:foo2]; 

如果运算符重载是必备function,请改用C ++,或使用Objective-C ++(但请记住,C ++类和Objective-C对象完全不同)。


编辑:

C预处理器在概念上非常简单,它对C的语法非常非常了解,并且对C的类型一无所知。 如果你想使用预处理器重载操作符,那么它必须学习代码中使用的每种类型(包括自定义类型),并且必须执行静态类型检查以确定要调用的函数,这是超出预处理器范围的东西。

这是一个有趣的想法,但它根本不可能。

使用预处理器无法实现这一点。 此外,据我所知,没有其他function可以在目标C中提供此function。

但是,如果您使用C ++(或Objective-C ++,它为您提供Objective C和C ++的所有function),您可以定义一个operator+ ,如下所示:

 struct myStruct { myStruct operator+(myStruct const & other) { return ...; } } 

如果你将问题限制在预处理器上,那么答案就是不可能由于定义一个接受参数的宏你需要有一个括号宏

#define __DO_STH(par1,par2)

运算符重载您认为它的方式不使用括号,因此您无法创建任何此类宏

唯一的方法是创建一个简单的解析器,它将读取你的代码,每当遇到结构时,你需要添加一个加号吐出C代码替换它与函数,但为什么这样做而不是使用C ++本地支持?

除非你要求纯粹的学术目的,否则我的诚实观点是,运算符重载总是比坏的更糟糕并且更好地避免。

我知道的唯一方法是使用Objective-C ++。 为此,请为您的实现文件指定扩展名“mm”,然后就可以了。