7

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

-(void) someMethod (void);

但同意这一点——

 -(void) someMethod;

(SomeClass.h)

我读过在参数中声明 (void) 比不声明更好,但我可能错过了一些观点。

4

2 回答 2

20

对于 Objective-C,你不能这样做。

在 Objective-C 中,每个参数都必须在:eg之后

- (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 参数的任何好处(明确声明事物并不总是好的)。

于 2013-08-17T10:32:48.640 回答
5

扩展@xlc的答案

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

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

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

但是,需要保持与现有代码的向后兼容性。foo()因此,不能假定函数声明的意思是“没有参数的函数”。为了解决这个问题,void引入了关键字。这使您可以说foo(void)“不带参数的名为 foo 的函数”。

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

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

于 2013-08-17T16:00:41.820 回答