AMXXPawn 常量

1. 简介

常量(Constant)是由用户创建的标识符,其数值在编译时就能确定,并且不可更改。

常量通常用于代替数值字面量,让意义不明的魔法数字变成能够看懂的英文,提高可读性。

在函数外声明的是全局常量,在函数内声明的是局部常量。

常量有三种,普通常量、枚举类名和枚举常量(枚举成员)。

普通常量声明语句语法:

<const> \值类型标签/ <常量名称> <初始化表达式> \ ; /

枚举声明语句的语法:

<enum> \值类型标签/ \枚举类名/ \升值器/ < { > \枚举常量声明/ < } > \ ; /

升值器语法拆解:

< ( > \<多字节赋值运算符> <常量表达式>/ < ) >

枚举常量声明语法拆解:

\属性值类型标签/ \枚举常量名称/ \属性尺寸声明/ \初始化表达式/ \ , /

属性尺寸声明语法拆解:

< [ > <常量表达式> < ] >

初始化表达式语法拆解:

< = > <常量表达式>

<>是必填项目,\/是可选项目。

关于枚举声明语句的更多详情:点击查看enum指南

代码示例:

const MAX_PLAYERS = 32; enum {}; // AMXXPawn允许这种毫无意义的写法 enum { print_notify = 1, print_console, print_chat, print_center, print_radio /* Counter-Strike only */ }; enum LibType { LibType_Library, LibType_Class };

2. 常量特性

3. 值类型标签

若不填写值类型标签,常量将会获得默认的_标签。

代码示例:

// 下面两行代码是相同的 const _:MAX_PLAYERS = 32; const MAX_PLAYERS = 32; // 下面两行代码是相同的 enum _:LibType { }; enum LibType { }; enum { // 下面两行代码是相同的(此标签为结构体属性标签,而非常量标签,常量标签与枚举类名相同) _:ZCN_MaxHealth, ZCN_MaxHealth, };

若填写未定义的值类型标签,编译器会自动创建这个标签。

当常量与拥有不同标签的表达式做运算时,通常会触发编译器警告:

// MAX_PLAYERS拥有_标签,表达式32.0拥有Float标签,触发警告:"标签不匹配"
const _:MAX_PLAYERS = 32.0;

通过观察常量的标签就可以立即确认需要填写什么类型的初始值。

因此,应该尽量使用真正的常量代替 #define 定义的宏常量。

点击查看值类型标签指南

4. 初始化表达式

常量值的初始化表达式中只能含有常量表达式(单值字面量、常量以及相关的运算表达式)。

不能含有变量、函数、重载的运算符。

注意:若表达式含有重载的运算符,则不是常量表达式! #include <float> /* float.inc内含有此定义: * native Float:operator+(Float:oper1, Float:oper2) = floatadd; * 因此两个浮点数字面量之间的加法: 10.0 + 5.0将会变为floatadd(10.0, 5.0) * 而初始化表达式不能包括函数,因此会报错:"必须使用常量表达式" */ const Float:constant1 = 10.0 + 5.0; // 必须直接写出运算结果 const Float:constant2 = 15.0; // 两个整数字面量之间的加法并未被重载,可以使用 const constant3 = 10 + 5; // 初始化表达式可以包括其他常量 const constant4 = constant3 + 5;

枚举类名的初始值由升值器和最后一个枚举常量共同决定。

未显式赋值的枚举常量初始值由升值器和上一个枚举常量共同决定。

更多详情:点击查看enum指南

5. AMX Mod X 内置常量

常量名称 值类型标签 介绍
true bool 表示真,对,是,好,允许,开启,正确
值为1,但任何非0数都可表示true
false bool 表示假,错,否,坏,禁止,关闭,错误
值为0
EOS _ 字符串终止符,遍历字符时,遇到它应该停止遍历
值为0,或者用字面量'^0'表示
cellbits _ 单元的二进制位数
值为32,AMX Mod X 并不支持其他位数
cellmin _ 单元最小值
值为-2147483648,或者用字面量0xFFFFFFFF表示
cellmax _ 单元最大值
值为2147483647,或者用字面量0x7FFFFFFF表示
charbits _ 压缩字符的二进制位数
值为8,AMX Mod X 并不支持其他位数
charmin _ 普通字符或压缩字符最小有效值
值为0
charmax _ 压缩字符最大有效值
值为254
ucharmax _ 单元值在0至此值范围内,不可能存有压缩字符
值为0xFFFFFF
debug _ 表示调试等级
0=禁调试,删除标识符和断言,索引可越界
1=禁调试,删标识符,可断言,索引可越界
2=可调试,留标识符,可断言,禁索引越界
__Pawn _ 表示当前Pawn版本
__LINE__ _ AMX1.8.3新增的常量,表示当前行号数
若文件中存在#line指令,__LINE__ = 上一个#line值 + 实际行号 - 上一个#line所在行

6. 常量的常见认知误区

单值字面量是不是常量?

字符串、数组、结构体字面量是不是常量?

宏常量是不是常量?

常量是不是变量?