4.3.4:public stock const公共备用常量
public
声明函数的语法格式:
说明符1 public 说明符3 说明符4 标签 函数名称 参数列表 状态分类器 函数体;
参考:
/*无*/ public /*无*/ /*无*/ bool: customFunction (param1, param2, param3) <Automaton:State> {}
public
声明变量的语法格式:
说明符1 public 说明符3 说明符4 标签 变量名称 维度列表 初始化表达式;
参考:
new public stock const bool: customSymbol [2][2][2][2] =true;
public
通常用于声明"公共函数".但也可以用于声明"公共变量".
声明变量时,public
可以与new stock const
说明符同时存在.
public
是2号位的说明符,只有1号位的new
能写在public
左边.3号位的stock
,4号位的const
必须写在public
的右边.
public
说明符有以下特性:
相对其它说明符,public
的第3与第4个特性是独一无二的.
public
的特性拥有仅次于new
的优先级.
同时使用多个说明符时,若与其它说明符的某些特性有冲突,以高优先级的为主.
public
说明符写在函数体外.可用于声明公共函数.
调用公共函数的代码,可以写在声明函数的代码上面.
不像声明变量的时候,仅允许把调用变量的代码写在声明的代码下面.
标签是可省略的.
在函数名称左边填写标签.表示该函数的返回值所属类型,或具体用途.
若省略标签,则默认该函数返回值使用 _: 标签.
函数名称是自定义的,命名时应遵从符号命名规则.
在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
的特性是:"在函数体内,可将运行时表达式用作变量的初始化表达式".
而public
只能在函数体外使用.
目前看来,填写new
并没有什么附加作用.
public
说明符仅可写在函数体外.可用于声明公共变量.
调用变量的代码,不能写在声明变量的代码上面.
不像声明函数,调用函数的代码,可以写在声明函数的代码上面.
public
声明的变量拥有地址,可通过地址查改变量的值.
说明符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"这五者之一.
通常根据用途,给符号设定相关的英文名.
不得与保留词或用户声明的其它符号重名.
AMXX1.8.3以下版本中,public
说明符不允许声明数组变量.
维度列表是可省略的.
声明每个变量都可在右边填写维度列表(方括号).表示该变量的数据结构.
若省略维度列表,则默认该变量仅能储存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个数值.
方括号中的数值必须是字面量或无地址的常量,像public
声明的有地址变量是不允许填入维度列表的.
方括号中的数值是可省略的.省略时,编译器会根据初始化表达式决定具体数量(这种情况下不允许省略初始化表达式).
初始化表达式是可省略的.
声明每个变量都可以在其维度列表右边(若没有就在变量名称右边)填写初始化表达式(以 =
符号开头的赋值表达式).
表示该变量的默认值.
若被声明的变量是数组,应赋值为字符串或数组字面量.否则应赋值为单个数值字面量.
若省略初始化表达式,则该变量的默认值为0.
初始化表达式可以用 ,
符号结尾,用于连续声明变量.
也可以用 ;
符号结尾,表示停止继续声明变量.
通常情况下是可以省略 ;
符号的.但在检查分号模式下不允许省略 ;
符号.
// 最普通的声明方式(没有参数,没有设定函数返回值.函数默认返回0)
public function1()
{
}
// 声明返回值固定为1的公共函数
public function2() return 1;
// 声明带有标签的公共函数
public Float:function3() return 15.0;
// 声明返回值由参数决定的公共函数
public function4(p1, p2, p3) return p1 + p2 + p3;
// 声明返回值为数组的公共函数
public function5(p1)
{
static array[32];
switch (p1)
{
case 0: array = "p1等于0";
case 1: array = "p1等于1";
default:array = "p1等于其它";
}
return array;
}
若不是必须让外界访问,则不应该用public
声明函数.
除非你已考虑到如何处理该函数被外界访问可能造成的后果,
否则,声明函数时应该删除说明符(声明私有函数).
或使用static stock
说明符(声明静态或备用函数).
注意:若声明没有说明符的函数时,函数名第1个字符为 @
符号.那么这个函数也是公共函数.
// @function6是一个公共函数
@functon6() { }
在amxmodx.inc
文件中提供了callfunc_*系列函数,用于调用各个插件的公共函数.
// 最普通的声明方式(未填写初始化表达式,因此变量的值为0)
public gVariable1;
// 连续声明多个变量,并初始化
public gVariable2 = 2, gVariable3 = 3, gVariable4 = 100;
// 声明带有标签的变量
public bool:gVariable5 = true, Float:gVariable6 = 222.0;
// 声明拥有维度列表的变量,这是尺寸为4的1维数组,拥有4个值为0的元素(仅AMXX1.8.3以上版本支持)
public gVariable7[4];
// 声明尺寸由初始化表达式决定的1维数组变量,拥有4个元素,因此尺寸为4
public gVariable8[] = { 1, 2, 3, 4 };
// 声明尺寸为5的3维数组变量,并设定其内2维数组的尺寸为2,1维数组的尺寸为3
public 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 },
}
};
同时使用public const
,则所声明的符号是是有地址的公共常量.
去除const
的特性:
"不能连续声明常量",
"声明的常量不能是数组",
"声明的常量必须初始化",
"声明的常量不能用作引用参数".
保留const
的特性:
"声明的常量不能被运算符更改".
// 声明一个有地址的公共常量,不能被运算符更改.
public const gPublicConstant = 222;
同时使用public stock
,则声明的变量是公共备用变量.
去除stock
的特性:
未知.
保留stock
的特性:
"说明符仅允许在函数体外使用",
"不警告符号未被使用,不将未被使用的符号编译到amxx文件".
// 声明一个公共备用变量,接下来的代码中并未调用它,则不被写入amxx文件,因此不会触发警告:"gPublicStock符号从未被使用"
public stock gPublicStock = 222;
目前看来,同时使用new public
与单独使用public
没什么不同.
new
说明符允许将运行时表达式用作变量的初始化表达式.
但在函数体外无法表现出这个特性.AMXX不支持在函数体外运行函数.
因此,目前看来,同时使用new public
并没有什么用处.
// 声明一个公共变量,可被其它文件,插件,模块访问
new static gNewPublic = 222;
同时使用public stock const
,则所声明的符号是公共备用常量.
继承stock
与const
的特性,使被声明的符号不能被运算符更改.并且在未被使用情况下,不会被编译到amxx文件中.
// 声明一个公共备用常量
public stock const gPublicStockConstant = 222;
在AMXX1.8.2以上版本中,amxconst.inc
文件内便声明了这种有地址常量.
虽然编译时该常量的值为0,但插件运行后,由模块更改它的值.
插件访问这个常量得到的是被更改后的值.
// 服务器最大客户端数量,由模块设定这个常量的值.
public stock const MaxClients;
在amxmodx.inc
文件中提供了get_xvar_* set_xvar_*系列函数.
外界可用这些函数,查改公共变量或常量.
使用public
声明函数,是希望该函数由外界调用.
比如用于添加挂钩的register_forward RegisterHam
函数,会要求开发者填写公共函数名称.
然后,fakemeta hamsandwich模块会在合适的时机,调用开发者提供的公共函数.
使用public
声明变量或常量,本应该是希望由外界进行查改.
然而AMXX设计者提供的查改函数只能通过变量名称进行访问,
无法区分不同插件的同名公共变量(仅第一个插件的公共变量能被访问).
这一点可能是设计者考虑不周.导致公共变量的应用场景几乎没有.