常量(Constant)是由用户创建的标识符,其数值在编译时就能确定,并且不可更改。
常量通常用于代替数值字面量,让意义不明的魔法数字变成能够看懂的英文,提高可读性。
在函数外声明的是全局常量,在函数内声明的是局部常量。
常量有三种,普通常量、枚举类名和枚举常量(枚举成员)。
<const> \值类型标签/ <常量名称> <初始化表达式> \ ; /
<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
};
若不填写值类型标签,常量将会获得默认的_标签。
代码示例:
// 下面两行代码是相同的
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 定义的宏常量。
常量值的初始化表达式中只能含有常量表达式(单值字面量、常量以及相关的运算表达式)。
不能含有变量、函数、重载的运算符。
#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;
| 常量名称 | 值类型标签 | 介绍 |
|---|---|---|
| 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所在行 |