运算符'重载'与C / Objective-C中的#define等效

时间:2012-02-04 10:14:41

标签: objective-c c struct operator-overloading c-preprocessor

  

可能重复:
  Operator overloading in 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)

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

Foo *result = [foo1 fooByAddingFoo:foo2];

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

Foo *foo1 = [Foo fooWithBar:bar];

[foo1 addFoo:foo2];

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


编辑:

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

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

答案 2 :(得分:1)

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

#define __DO_STH(par1,par2)

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

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

除非你要求纯粹的学术目的,否则我的诚实意见是,运营商的重载总是比坏事好,最好避免。

答案 3 :(得分:1)

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