C语言函数全解析
立即解锁
发布时间: 2025-08-20 01:16:48 阅读量: 1 订阅数: 4 


Arduino C语言编程入门与实践
### C语言函数全解析
#### 1. 函数签名与函数原型
函数签名由函数类型说明符、函数名和函数的参数列表共同组成。例如,判断闰年的函数签名如下:
```c
int IsLeapYear(int year) // Function signature
```
若在函数签名末尾添加分号,它就变成了函数原型:
```c
int IsLeapYear(int year); // Function prototype... note semicolon at end
```
函数原型的作用是辅助编译器进行检查,包括函数名拼写是否正确、传递给函数的数据类型是否准确以及返回值的使用是否恰当。通常,函数原型会出现在源代码文件的顶部,这样编译器能在实际使用函数之前读取到这些信息,并将其存入符号表,用于类型检查。
需要注意的是,Arduino编译器会维护标准库函数的内部函数原型列表,还会为用户编写的函数创建临时原型。若项目包含多个源代码文件,一般会为这些额外的文件创建头文件。例如,若添加了名为`MyFunctions.cpp`的源文件,还需创建名为`MyFunctions.h`的头文件,其中包含`MyFunctions.cpp`中所有函数的原型及其他信息。然后,在`*.ino`项目文件的顶部添加如下代码:
```c
#include "MyFunctions.h"
```
这会告知编译器读取该头文件,以便对新函数进行类型检查。
函数原型不会生成实际代码,函数的实际代码位于库中或后续代码里,因此不会为函数原型分配实际的程序内存,在符号表中也没有左值。函数原型属于数据声明,而非数据定义。
#### 2. 函数体
函数体从参数列表右括号后的左花括号`{`开始,到函数的右花括号`}`结束。函数体中的语句决定了函数的具体实现方式。
若函数类型说明符不是`void`,函数体中至少要有一条语句包含`return`关键字。例如计算立方体体积的函数:
```c
int VolumeOfCube(int width, int length, int height)
{
int volume;
volume = width * length * height;
return volume;
}
```
有经验的C程序员会简化代码,去掉临时变量:
```c
int VolumeOfCube(int width, int length, int height)
{
return width * length * height;
}
```
不过,Arduino C编译器在返回值方面较为宽松。例如以下代码:
```c
int myFunction(int a)
{
int temp = a;
}
```
若未开启详细的编译器消息,编译器不会对缺少返回值的问题发出警告。若执行如下代码:
```c
int number = myFunction(10);
```
`number`会被赋予不确定的值,调试此类错误会很棘手。
若将函数类型说明符从`int`改为`void`:
```c
void myFunction(int a)
{
int temp = a;
}
```
再尝试执行:
```c
int number = myFunction(10);
```
编译器会发出错误信息`void value not ignored as it ought to be`,有助于发现错误。
#### 3. 重载函数
当多个函数具有相同名称,但有两个或更多不同的签名时,这些函数被称为重载函数。多数情况下,不同签名的区别在于参数列表。虽然C语言不允许重载函数,但基于GCC编译器的Arduino C支持重载函数。
例如`random()`函数,既可以传入上下界值:
```c
randomNumber = random(MIN, MAX);
```
也可以只传入一个参数:
```c
random(201);
```
`Serial.print()`方法同样是重载函数,既可以这样使用:
```c
Serial.print(val);
```
若要以十六进制显示`val`,则可以:
```c
Serial.print(val, HEX);
```
重载函数能在编程中提供一致性,当函数执行任务有细微差别时,使用相同名称可增加选择。
#### 4. 优秀函数的特质
- **使用面
0
0
复制全文
相关推荐









