4.3.4:static stock const静态备用常量
static
声明函数的语法格式:
说明符1 static 说明符3 说明符4 标签 函数名称 参数列表 状态分类器 函数体;
参考:
/*无*/ static stock /*无*/ bool: customFunction (param1, param2, param3) <Automaton:State> {}
static
声明变量的语法格式:
说明符1 static 说明符3 说明符4 标签 变量名称 维度列表 初始化表达式;
参考:
new static stock const bool: customSymbol [2][2][2][2] =true;
static
可用于声明"静态函数"或"静态变量".
声明函数时,static
可以与stock
说明符同时存在.
声明变量时,static
可以与new stock const
说明符同时存在.
static
是2号位的说明符,只有1号位的new
能写在static
左边.3号位的stock
,4号位的const
必须写在static
的右边.
static
说明符有以下特性:
相对其它说明符,static
的第2与第3个特性是独一无二的.
static
的特性拥有仅次于new
的优先级.
同时使用多个说明符时,若与其它说明符的某些特性有冲突,以高优先级的为主.
声明函数时,不允许填写说明符1.因为new
作为唯一的1号位说明符,不能用于声明函数.
static
说明符写在函数体外.可用于声明静态函数.
调用静态函数的代码,可以写在声明函数的代码上面.
不像声明变量的时候,仅允许把调用变量的代码写在声明的代码下面.
说明符3是可省略的.
说明符3只能写stock
,这是唯一的3号位说明符.
若填写stock
,编译器不会警告符号(函数)未被调用.
若符号(函数)未被调用,则编译时,不会将符号(函数)写入amxx文件,不会占用内存空间.
声明函数时,不允许填写说明符4.因为const
作为唯一的4号位说明符,不能用于声明函数.
标签是可省略的.
在函数名称左边填写标签.表示该函数的返回值所属类型,或具体用途.
若省略标签,则默认该函数返回值使用 _: 标签.
函数名称是自定义的,命名时应遵从符号命名规则.
在AMXX1.8.3以下版本中,符号名称不得超过31个字符.
在AMXX1.8.2以上版本中,符号名称不得超过63个字符.
名称的第一个字符必须是"_ @ a至z A至Z"这四者之一.
名称的剩余字符必须是"_ @ a至z A至Z 0至9"这五者之一.
通常根据用途,给符号设定相关的英文名.
不得与保留词或用户声明的其它符号重名.
参数列表必须以 ( )
符号作为出入口.其内可填入多个参数.
参数列表用于声明函数正确运作所需的参数.参数的数量没有限制.且允许有默认值.
每个参数需要用 ,
符号隔开.
状态分类器必须以 < >
符号作为出入口,其内可填入多个状态名称.
状态分类器用于将函数划分给特定的插件状态,仅在该状态下能被调用.
更多详情,请参阅:cs1.6 amxx编程 状态分类器精研教程
.
函数体可以使用 { }
符号作为出入口.其内可填入多条语句.
若省略 { }
符号,则仅允许填写1条语句.且允许以 ;
符号结尾(检查分号模式下,必须以 ;
符号结尾).
每个public
仅允许声明一个函数.因此函数体结尾不允许用 ,
符号连续声明函数.
说明符1是可省略的.
说明符1只能写new
,这是唯一的1号位说明符.
但函数体内不允许同时使用new static
声明变量.它们的特性有冲突.
new
的特性是:"在函数体内,可将运行时表达式用作变量的初始化表达式".
目前看来,在函数体外同时使用new static
与单独使用static
并没有什么不同.
static
说明符仅可写在函数体外.可用于声明静态变量.
调用变量的代码,不能写在声明变量的代码上面.
不像声明函数,调用函数的代码,可以写在声明函数的代码上面.
static
声明的变量拥有地址,可通过地址查改变量的值.
说明符3是可省略的.
说明符3只能写stock
,这是唯一的3号位说明符.
若填写stock
,编译器不会警告符号(变量)未被调用.
若符号(变量)未被调用,则编译时,不会将符号(变量)写入amxx文件,不会占用内存空间.
说明符4是可省略的.
说明符4只能写const
,这是唯一的4号位说明符.
表示声明的变量只能被初始化表达式设置默认值.接下来的代码中不能被任何运算符更改.
标签是可省略的.
声明每个变量都可在左边填写标签.表示该变量的运算方式或用途.
若省略标签,则默认该变量使用 _: 标签.
变量名称是自定义的,命名时应遵从符号命名规则.
在AMXX1.8.3以下版本中,符号名称不得超过31个字符.
在AMXX1.8.2以上版本中,符号名称不得超过63个字符.
名称的第一个字符必须是"_ @ a至z A至Z"这四者之一.
名称的剩余字符必须是"_ @ a至z A至Z 0至9"这五者之一.
通常根据用途,给符号设定相关的英文名.
不得与保留词或用户声明的其它符号重名.
维度列表是可省略的.
声明每个变量都可在右边填写维度列表(方括号).表示该变量的数据结构.
若省略维度列表,则默认该变量仅能储存1个数值.
在AMXX1.10.0以下版本中,一个变量仅允许0至3对方括号,在AMXX1.9.0以上版本中,一个变量允许有0至4对方括号.
拥有维度列表的变量被称为数组.假设变量A拥有4对方括号,那么A是4维数组.
4维数组内存放的是3维数组,3维数组内存放的是2维数组,2维数组内存放的是1维数组,1维数组内存放的是数值.
数组内存放的对象被称作元素.而方括号内填写的数值则是表示数组的尺寸,或容量,或元素数量.
假设A的维度列表是[2][3][4][5]
,那么A的元素数量是2,
A的每个元素都是3维数组,每个3维数组的元素数量都是3,
3维数组的每个元素都是2维数组,每个2维数组的元素数量都是4,
2维数组的每个元素都是1维数组,每个1维数组的元素数量都是5,
1维数组的每个元素都是数值,因此每个1维数组都拥有5个数值.
方括号中的数值必须是字面量或无地址的常量,像static
声明的有地址变量是不允许填入维度列表的.
方括号中的数值是可省略的.省略时,编译器会根据初始化表达式决定具体数量(这种情况下不允许省略初始化表达式).
初始化表达式是可省略的.
声明每个变量都可以在其维度列表右边(若没有就在变量名称右边)填写初始化表达式(以 =
符号开头的赋值表达式).
表示该变量的默认值.
若被声明的变量是数组,应赋值为字符串或数组字面量.否则应赋值为单个数值字面量.
若省略初始化表达式,则该变量的默认值为0.
初始化表达式可以用 ,
符号结尾,用于连续声明变量.
也可以用 ;
符号结尾,表示停止继续声明变量.
通常情况下是可以省略 ;
符号的.但在检查分号模式下不允许省略 ;
符号.
// 最普通的声明方式(没有参数,没有设定函数返回值.函数默认返回0)
static function1()
{
}
// 声明返回值固定为1的静态函数
static function2() return 1;
// 声明带有标签的静态函数
static Float:function3() return 15.0;
// 声明返回值由参数决定的静态函数
static function4(p1, p2, p3) return p1 + p2 + p3;
// 声明返回值为数组的静态函数
static function5(p1)
{
static array[32];
switch (p1)
{
case 0: array = "p1等于0";
case 1: array = "p1等于1";
default:array = "p1等于其它";
}
return array;
}
public声明的函数能被外界访问,而static则不同,仅允许当前文件访问.
若希望当前插件的每个引用文件中都能访问自定义函数,则不应该使用任何说明符.
没有说明符的函数,若函数名第1个字符不是 @
符号,则是私有函数.仅允许当前插件访问.
// 最普通的声明方式(未填写初始化表达式,因此变量的值为0)
static gVariable1;
// 连续声明多个变量,并初始化
static gVariable2 = 2, gVariable3 = 3, gVariable4 = 100;
// 声明带有标签的变量
static bool:gVariable5 = true, Float:gVariable6 = 222.0;
// 声明拥有维度列表的变量,这是尺寸为4的1维数组,拥有4个值为0的元素(仅AMXX1.8.3以上版本支持)
static gVariable7[4];
// 声明尺寸由初始化表达式决定的1维数组变量,拥有4个元素,因此尺寸为4
static gVariable8[] = { 1, 2, 3, 4 };
// 声明尺寸为5的3维数组变量,并设定其内2维数组的尺寸为2,1维数组的尺寸为3
static Float:gVariable9[5][2][3] =
{
{
{ 1.0, 2.0, 3.0 },
{ 4.0, 5.0, 6.0 },
},
{
{ 7.0, 8.0, 9.0 },
{ 10.0, 11.0, 12.0 },
},
{
{ 13.0, 14.0, 15.0 },
{ 16.0, 17.0, 18.0 },
},
{
{ 19.0, 20.0, 21.0 },
{ 22.0, 23.0, 24.0 },
},
{
{ 25.0, 26.0, 27.0 },
{ 28.0, 29.0, 30.0 },
}
};
同时使用static const
,则所声明的符号是是有地址的公共常量.
去除const
的特性:
"不能连续声明常量",
"声明的常量不能是数组",
"声明的常量必须初始化",
"声明的常量不能用作引用参数".
保留const
的特性:
"声明的常量不能被运算符更改".
// 声明一个有地址的静态常量,不能被运算符更改.
static const gStaticConstant = 222;
同时使用static stock
,则声明的变量是静态备用变量.
去除stock
的特性:
未知.
保留stock
的特性:
"说明符仅允许在函数体外使用",
"不警告符号未被使用,不将未被使用的符号编译到amxx文件".
// 声明一个静态备用变量,接下来的代码中并未调用它,则不被写入amxx文件,因此不会触发警告:"gStaticStock符号从未被使用"
static stock gStaticStock = 222;
目前看来,同时使用new static
与单独使用static
没什么不同.
new
说明符允许将运行时表达式用作变量的初始化表达式.
但在函数体外无法表现出这个特性.AMXX不支持在函数体外运行函数.
因此,目前看来,同时使用new static
并没有什么用处.
// 声明一个静态变量,仅当前文件可以访问它
new static gNewStatic = 222;
同时使用static stock const
,则所声明的符号是静态备用常量.
继承stock
与const
的特性,使被声明的符号不能被运算符更改.并且在未被使用情况下,不会被编译到amxx文件中.
// 声明一个静态备用常量
static stock const gStaticStockConstant = 222;
static
使函数和全局变量仅在当前文件中可用.
static
使局部变量表现出全局变量的效果,但仅在特定代码块内可用.
总而言之,static
用于限制自定义符号的可见范围.