方法参数(void)vs无void声明(编译器错误)

时间:2013-08-17 10:17:50

标签: objective-c

为什么编译器在这种方法声明的情况下会出错 -

-(void) someMethod (void);

但批准了这个 -

 -(void) someMethod;

(SomeClass.h)

我已经读过,最好在参数中声明(void)而不是声明,但是probalby我错过了一些观点。

2 个答案:

答案 0 :(得分:15)

您无法为Objective-C执行此操作。

在Objective-C中,每个参数必须在:之后,例如

- (void)someMethod:(int)i;
- (void)someMethod:(int)i withString:(NSString *)string;
- (void)someMethod:(int)i :(int)i2 :(int)i3; // you can do this but is bad style

并且制作像

这样的东西是没有意义的
- (void)someMethod:(void)what_goes_here;

所以如果你想要一个没有参数的方法:

- (void)someMethod;

但是你可以在C / C ++

中完成
void someMethod(void);

我没有看到声明void参数的任何好处(明确声明事情并不总是好的)。

答案 1 :(得分:4)

扩展@ xlc的答案

答案是Objective-C和“普通”C / C ++之间的语法差异。

回到Unix和C天的起源,60年代末期/ 70年代早期,当声明(未定义)一个函数时,你不需要指定它接受了多少个参数,或者它们需要什么类型。您也不需要指定它是否返回了值。

后来,人们意识到这对于在编译时更好的错误检测和更高的生成代码效率都是一个好主意。因此,实现者添加了在函数声明中指定参数类型的功能。这在80年代后期被标准化为ANSI C的一部分。

但是,需要保持与现有代码的向后兼容性。因此,foo()的函数声明不能​​被认为是指“没有参数的函数”。为解决此问题,引入了void关键字。这允许你说foo(void)意思是“没有参数的名为foo的函数”。

当Objective-C在90年代发明时,他们添加了一种新的语法来定义方法。因为没有遗留代码可以处理,所以他们只是说方法必须声明它的所有参数;如果没有,则该方法不带参数。

Objective-C仍然使用void关键字来指示方法不返回任何值。