功能定义
现在我们已经完成了一些示例,让我们看一下函数定义的一般形式:
void function-name() { 变量声明等 表达式... // 不需要显式返回。 }
函数不返回特殊值,也不返回传入参数。
void function-name(data-type variable) { 变量声明等 表达式... // 不需要显式返回。 } 如果需要多个变量,只需使用“,”作为分隔符:
一个函数不返回特殊值,而是返回一个参数。
void function-name(数据类型变量、数据类型变量等) { 变量声明等。 表达式... // 不需要显式返回。 }
一个函数不返回特殊值,但有多个参数。
void function-name(数据类型变量、数据类型变量等) { 变量声明等。 表达式... 返回返回值 }
函数返回特定数据类型的值,并且具有多个输入参数。
返回函数的类型必须与函数返回的返回值的数据类型相同. 返回值可以是常数值或变量。 它必须以关键字“return 开头。”
以下规则控制返回类型:
- 返回类型几乎没有限制,除了数组。 (数组是关于如何创建数据的另一个更高级的主题。 它超出了本文的范围,不在此处介绍。
- 指定返回类型“void”意味着不需要返回值。 子句“return”是隐含的。 这意味着您必须在“void”函数的末尾显式声明“return”。
在 main() 之前还是之后创建一个函数?
编译器从上到下读取您的文件。 因此,顺序确实很重要。
让我们以简单的最大公分母 (GCD) 函数为例。 你会得到一个错误:use of undeclared identifier ' getGCD'
实际上,无论是来自 main() 还是其他调用功能块都是如此,即“被调用功能块”必须在“调用功能块”之前。
两种可能的解决方案:
int getGCD(int a, int b) { int 余数 = 1; while (remainder > 0) { 余数 = a % b ; a = b; b = 余数; } 返回一个; } int main() { Brain.Screen.printAt (5,60, “GCD ( %d, %d )= %d”, getGCD(60, 100) ); }
在示例“main()”中,将“被调用函数”移到“调用函数块”上方。
int getGCD(int, int); int main() { Brain.Screen.printAt(5,60, "GCD ( %d, %d ) = %d", getGCD(60, 100) ); } int getGCD(int a, int b) { 整数余数 = 1; while (remainder > 0) { 余数 = a % b ; a = b; b = 余数; } 返回一个; }
将函数的原型(也称为签名)放在“调用函数块”之前。
如果您希望模块化不同文件中的函数怎么办?
第一步:创建一个头文件,将函数的原型放入这个文件中。
例如创建一个名为“myFuncs.h”的文件
在编译代码之前,您需要将此头文件“添加”到您的项目中。 这允许 VEXcode Pro V5 IDE 在开始构建您的项目之前“意识到”包含这个新头文件。
方法如下:
在这个头文件“common.h”中(你可以随意命名,只要它是没有空格的字母数字。)
第 2 步:创建一个单独的 cpp 文件,例如,名为 common.cpp
//这是common.cpp文件 int getGCD(int a, int b) { int剩余 = 1; while (remainder > 0) { 余数 = a % b ; a = b; b = 余数; } 返回一个; }
将函数 getGCD(...) 移动到这个文件中
#include "vex.h" #include "common.h" 使用命名空间 vex; int main() { vexcodeInit(); Brain.Screen.printAt(5,60, "GCD ( %d, %d ) = %d", getGCD(60, 100) ); }
现在,您在主 cpp 文件中的所有内容将包含以下内容
参考:https://api.vexcode.cloud /v5/html/namespacevex.html
将来的主题将在知识库的更高级部分中涵盖:
- 按值传递与按引用传递
- 传入一个数组
- 传入一个结构