如果我有结构:
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)
。
答案 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”,然后就可以了。