上面的代码就是声明的一个名为print的函数,void是它的返回值类型,参数是放在括号里面的,与我们的面向对象的方法有点不一样。void print(NSString *message);
如果省略了函数的返回类型声明,而该函数又确实是有返回值,编译器就会假设该值为整数。函数的默认发挥类型和方法的默认返回类型不同,如果没有指定方法的返回类型,编译器就会返回id类型的值。
函数的声明不仅用于声明函数的返回类型,也用于告诉编译器,该函数带有多少参数机器类型。我们可以只给函数指定一个参数的类型,也可以在选择类型以后给定一个假名称,在实际的编译过程中实际上编译器是会忽略它的。
例如:
如果函数的参数不定,必须告诉编译器。int setNumber(int); 等价于 int setNumber(int n);
例如:
在我们实际使用NSLog的时候就可以给它制定多个参数,然后这里也是限定了NSLog的第一个参数必须是NSString的对象。void NSLog(NSString *format,...);
只有在调用函数之前添加了函数的定义或声明了该函数及其参数的类型时,编译器才会在调用该函数的时候自动将参数转换成相应的类型。
使用函数时需要注意以下几点:
默认情况下,编译器假设函数返回int类型
定义返回值为int的函数时,直接将它定义为int
当定义没有返回值的函数时,将它定义为void
只有当前面已经定义或声明了这个函数,编译器才会将参数转换成函数认可的类型
默认情况下函数是外部的,即函数的默认作用域是任何与该函数链接在一起的文件中的任何函数和方法都可以调用它。我们可以用static关键字来限制函数的作用域.
我们在GlobalFile.h文件里面去声明了2个静态函数,和一个默认的外部函数,在实际使用过程中我们只能在GlobalFile.m文件中使用那2个静态函数,而在外面是可以使用那个外部函数的。// GlobalFile.h static void printTest1(int i); static void printTest2(NSString *str); void printMessageTest(NSString *string);
这里要提醒大家一点,为什么要把函数的声明和实现分开。因为是不允许有同名的实现了的函数存在的,所以如果我们把函数的实现都放到头文件里面,那么在其他地方如果多次import了这个头文件,实际上就是已经重复的去实现了这个函数,那么编译就不会通过.// GlobalFile.m #import "GlobalFile.h" static void printTest1(int i){ NSLog(@"%d",i); } static void printTest2(NSString *str){ NSLog(@"%@",str); } void printMessageTest(NSString *string){ NSLog(@"%@",string); printTest2(@"///"); }