CAPL是一门类C语言,其自定义函数与C基本相似,但是CAPL也有自身的一些特性,暂时把这些叫做CAPL的拓展特性。
1:自定义函数,声明和定义时。可以不加放回值类型说明,此类函数默认放回值void
**示例1)int fun_1(int a);
**示例2)fun_2(int a);
这两种都是CAPL中合法的自定义函数。不过示例2中,默认返回类型为void。
2:允许用户自定义重载函数
重载函数概念:即在同一作用域中中,同时定义多个函数名相同的自定义函数。有c基础的,应该都知道,同一个工程中除非使用static限定函数,不然同名函数在编译时会出现错误。
重载函数的定义和声明格式要求
函数名相同,但是形参个数,参数类型,参数排列顺序,存在差异。
int Mulfun(int a,int b)
{
return a*b;
}
int Mulfun(int a,int b,int c)
{
return a*b*c;
}
float Mulfun(float a,float b, float c)
{
return a*b*c;
}
有两点需要特别注意:两点
1):参数排列顺序容易产生的误解 ,我查找了很多资料,很多都说参数排列顺序不同,也能构成重载函数。很容易让人产生误解,如下面的例子,直接将 形参a与b,互换位置。此处是不构成重载函数,编译时会报错。
int Mulfun(int a,int b)
{
return a*b;
}
int Mulfun(int b,int a)
{
return a*b;
}
2):重载函数定义时,必须保持放回值类型一致性(注意:此规定是CAPL中强制规定的,而在其他支持函数重载,如C++中,就不存在这种限制)。
同时大家思考一下,CAPL中这种设定,会不会对上述代码产生影响,当然会产生影响!这就导致了返回实际值的类型,和定义的放回值类型不一致。编译器会以函数定义的放回值为准。这样就会让计算结果失真。
3):自定义函数被调用时,实参要与形参保持类型一致
自定义函数被调用时,实参要与形参保持类型一致,如果类型不一致,则编译器会进行隐式转换,即将实参转换为形参的数据类型
4):CAPL中还允许重载函数的形参为空 ,如
int Mulfun() 注意这里()里面添加void,也是可以的*/
{
return 15;
}
3:CAPL中特殊的形参类型
注意此章节,也比较难懂
capl中的复杂类型,或我称为构造类型(引用了C、C++中的概念),如定时器类型,message类型都是能直接声明为函数的形参。虽然复杂,但是这些数据类型都是占用整数倍数的Byte的内存空间。
以“数据类型是不是整数倍Byte字节的内存”这个标准来看。CAPL中有一类特殊数据类型,即非整数Byte类型的数据类型
有以下表中的几种
| CAPL中比较特殊的几种函数参数 | ||||
| 格式 | 说明 | 错误用法 | ||
| FUN(signal * s) 或者 int FUN(signal *s) | 这个“s”必须是DBC 中定义的信号名 | 调用参数时,但是我们知道不同的signal是具有不同的长度的。是否说明调用时,必须使用同样的信号名 | ||
| FUN(sysvarFloat * ev) 或者 int FUN(sysvarFloat *ev) | sysvar:表明此函数参数是系统变量 Float:说明了系统变量的类型是浮点型 * ev:是说明了系统变量的名称(难道不需要,在前面写命名空间了吗?) | 调用此函数时, | ||
| FUN(diagRequest * dr) 或者 int FUN(diagRequest * dr) | ||||
| FUN(diagResponse * dr) 或者 int FUN(diagResponse * dr) | ||||
| 比较特殊的一种类型message作为函数形参,如果传入该形参的是实参,是用户自己定义的 则形参不需要使用“*”修饰,但是如果传入的实参时DBC定义的则需要在形参中使用“*”来修饰。 | ||||
4:函数参数中的一种类似于指针的形参
fun(int m[][]);
fun(int m1[]);
格式注意:方括号内不能填入具体数字,也就是不能填入具体常量。
就是对应传入的实参,可以是一维整形数组(对应形参fun(int m1[]);),二维整形数组(对应形参fun(int m[][]);)。都是可以的。长度不受限制。
因为CAPL中没有指针的定义。此种模式与C或C++中定义 int m[](c中把这种定义等价于指针)一样。

1万+

被折叠的 条评论
为什么被折叠?



