cs1.6 amxx编程 public精研教程 -- 作者:偶萤蛉(Oinling)

目录:

1:public简介

1.1:public的语法格式

1.2:public的特性

2:public声明函数详解

2.1:public

2.2:标签

2.3:函数名称

2.4:参数列表

2.5:状态分类器

2.6:函数体

3:public声明变量详解

3.1:说明符1

3.2:public

3.3:说明符3

3.4:说明符4

3.5:标签

3.6:变量名称

3.7:维度列表

3.8:初始化表达式

4:实例-public的基本使用方法

4.1:声明函数

4.2:声明变量

4.3:与其它说明符一起使用

4.3.1:public const公共常量

4.3.2:public stock公共备用变量

4.3.3:new public公共变量

4.3.4:public stock const公共备用常量

4.4:总结

1:public简介

1.1:public的语法格式

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;

1.2:public的特性

public通常用于声明"公共函数".但也可以用于声明"公共变量".

声明变量时,public可以与new stock const说明符同时存在.

public是2号位的说明符,只有1号位的new能写在public左边.3号位的stock,4号位的const必须写在public的右边.

public说明符有以下特性:

1:仅允许在函数体外使用.

2:可声明函数或变量.

3:被声明的函数或变量可被其它文件,插件,模块访问.

4:被声明的变量不能是数组.在AMXX1.8.2以上版本已移除此特性.

相对其它说明符,public的第3与第4个特性是独一无二的.

public的特性拥有仅次于new的优先级.

同时使用多个说明符时,若与其它说明符的某些特性有冲突,以高优先级的为主.

2:public声明函数详解

2.1:public

public说明符写在函数体外.可用于声明公共函数.

调用公共函数的代码,可以写在声明函数的代码上面.

不像声明变量的时候,仅允许把调用变量的代码写在声明的代码下面.

2.2:标签

标签是可省略的.

在函数名称左边填写标签.表示该函数的返回值所属类型,或具体用途.

若省略标签,则默认该函数返回值使用 _: 标签.

2.3:函数名称

函数名称是自定义的,命名时应遵从符号命名规则.

在AMXX1.8.3以下版本中,符号名称不得超过31个字符.

在AMXX1.8.2以上版本中,符号名称不得超过63个字符.

名称的第一个字符必须是"_ @ az AZ"这四者之一.

名称的剩余字符必须是"_ @ az AZ 09"这五者之一.

通常根据用途,给符号设定相关的英文名.

不得与保留词或用户声明的其它符号重名.

2.4:参数列表

参数列表必须以 ( ) 符号作为出入口.其内可填入多个参数.

参数列表用于声明函数正确运作所需的参数.参数的数量没有限制.但不允许有默认值.

每个参数需要用 , 符号隔开.

2.5:状态分类器

状态分类器必须以 < > 符号作为出入口,其内可填入多个状态名称.

状态分类器用于将函数划分给特定的插件状态,仅在该状态下能被调用.

更多详情,请参阅:cs1.6 amxx编程 状态分类器精研教程.

2.6:函数体

函数体可以使用 { } 符号作为出入口.其内可填入多条语句.

若省略 { } 符号,则仅允许填写1条语句.且允许以 ; 符号结尾(检查分号模式下,必须以 ; 符号结尾).

每个public仅允许声明一个函数.因此函数体结尾不允许用 , 符号连续声明函数.

3:public声明变量详解

3.1:说明符1

说明符1是可省略的.

说明符1只能写new,这是唯一的1号位说明符.

new的特性是:"在函数体内,可将运行时表达式用作变量的初始化表达式".

public只能在函数体外使用.

目前看来,填写new并没有什么附加作用.

3.2:public

public说明符仅可写在函数体外.可用于声明公共变量.

调用变量的代码,不能写在声明变量的代码上面.

不像声明函数,调用函数的代码,可以写在声明函数的代码上面.

public声明的变量拥有地址,可通过地址查改变量的值.

3.3:说明符3

说明符3是可省略的.

说明符3只能写stock,这是唯一的3号位说明符.

若填写stock,编译器不会警告符号(变量)未被调用.

若符号(变量)未被调用,则编译时,不会将符号(变量)写入amxx文件,不会占用内存空间.

3.4:说明符4

说明符4是可省略的.

说明符4只能写const,这是唯一的4号位说明符.

表示声明的变量只能被初始化表达式设置默认值.接下来的代码中不能被任何运算符更改.

3.5:标签

标签是可省略的.

声明每个变量都可在左边填写标签.表示该变量的运算方式或用途.

若省略标签,则默认该变量使用 _: 标签.

3.6:变量名称

变量名称是自定义的,命名时应遵从符号命名规则.

在AMXX1.8.3以下版本中,符号名称不得超过31个字符.

在AMXX1.8.2以上版本中,符号名称不得超过63个字符.

名称的第一个字符必须是"_ @ az AZ"这四者之一.

名称的剩余字符必须是"_ @ az AZ 09"这五者之一.

通常根据用途,给符号设定相关的英文名.

不得与保留词或用户声明的其它符号重名.

3.7:维度列表

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声明的有地址变量是不允许填入维度列表的.

方括号中的数值是可省略的.省略时,编译器会根据初始化表达式决定具体数量(这种情况下不允许省略初始化表达式).

3.8:初始化表达式

初始化表达式是可省略的.

声明每个变量都可以在其维度列表右边(若没有就在变量名称右边)填写初始化表达式(以 = 符号开头的赋值表达式).

表示该变量的默认值.

若被声明的变量是数组,应赋值为字符串或数组字面量.否则应赋值为单个数值字面量.

若省略初始化表达式,则该变量的默认值为0.

初始化表达式可以用 , 符号结尾,用于连续声明变量.

也可以用 ; 符号结尾,表示停止继续声明变量.

通常情况下是可以省略 ; 符号的.但在检查分号模式下不允许省略 ; 符号.

4:实例-public的基本使用方法

4.1:声明函数

// 最普通的声明方式(没有参数,没有设定函数返回值.函数默认返回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_*系列函数,用于调用各个插件的公共函数.

4.2:声明变量

// 最普通的声明方式(未填写初始化表达式,因此变量的值为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 }, } };

4.3:与其它说明符一起使用

4.3.1:public const公共常量

同时使用public const,则所声明的符号是是有地址的公共常量.

去除const的特性:

"不能连续声明常量",

"声明的常量不能是数组",

"声明的常量必须初始化",

"声明的常量不能用作引用参数".

保留const的特性:

"声明的常量不能被运算符更改".

// 声明一个有地址的公共常量,不能被运算符更改. public const gPublicConstant = 222;

4.3.2:public stock公共备用变量

同时使用public stock,则声明的变量是公共备用变量.

去除stock的特性:

未知.

保留stock的特性:

"说明符仅允许在函数体外使用",

"不警告符号未被使用,不将未被使用的符号编译到amxx文件".

// 声明一个公共备用变量,接下来的代码中并未调用它,则不被写入amxx文件,因此不会触发警告:"gPublicStock符号从未被使用" public stock gPublicStock = 222;

4.3.3:new public公共变量

目前看来,同时使用new public与单独使用public没什么不同.

new说明符允许将运行时表达式用作变量的初始化表达式.

但在函数体外无法表现出这个特性.AMXX不支持在函数体外运行函数.

因此,目前看来,同时使用new public并没有什么用处.

// 声明一个公共变量,可被其它文件,插件,模块访问 new static gNewPublic = 222;

4.3.4:public stock const公共备用常量

同时使用public stock const,则所声明的符号是公共备用常量.

继承stockconst的特性,使被声明的符号不能被运算符更改.并且在未被使用情况下,不会被编译到amxx文件中.

// 声明一个公共备用常量 public stock const gPublicStockConstant = 222;

在AMXX1.8.2以上版本中,amxconst.inc文件内便声明了这种有地址常量.

虽然编译时该常量的值为0,但插件运行后,由模块更改它的值.

插件访问这个常量得到的是被更改后的值.

// 服务器最大客户端数量,由模块设定这个常量的值. public stock const MaxClients;

amxmodx.inc文件中提供了get_xvar_* set_xvar_*系列函数.

外界可用这些函数,查改公共变量或常量.

4.4:总结

使用public声明函数,是希望该函数由外界调用.

比如用于添加挂钩的register_forward RegisterHam函数,会要求开发者填写公共函数名称.

然后,fakemeta hamsandwich模块会在合适的时机,调用开发者提供的公共函数.

使用public声明变量或常量,本应该是希望由外界进行查改.

然而AMXX设计者提供的查改函数只能通过变量名称进行访问,

无法区分不同插件的同名公共变量(仅第一个插件的公共变量能被访问).

这一点可能是设计者考虑不周.导致公共变量的应用场景几乎没有.