AMXXPawn中的符号大致可分为三类:
注意:符号需要先定义,然后才能使用。运算符和保留词是AMXXPawn定义的符号,有固定的作用。标识符是由用户自定义的符号,其用途由用户决定。
AMXXPawn提供了丰富的运算符,用于执行各种计算和操作:
+ - * / % ++ --
~ >> >>> << & | ^
= += -= *= /= %= >>= >>>= <<= &= |= ^=
== != < <= > >=
! && ||
[] {} () ? : : , defined sizeof tagof char
AMXXPawn中的关键字(保留词)具有特殊含义,不能用作标识符名称。
| 运算符 | 声明说明符 | 流程控制 |
|---|---|---|
| char | const | assert |
| defined | enum | break |
| operator | forward | case |
| sizeof | native | continue |
| tagof | new | default |
| public | do | |
| static | else | |
| stock | exit | |
| for | ||
| goto | ||
| if | ||
| return | ||
| sleep | ||
| state | ||
| switch | ||
| while |
警告:使用保留词作为标识符名称会导致编译错误。例如:
new tagof = 5; // 用保留词new定义一个名为tagof的变量,会报错.因为tagof是保留词
new switch = 5; // 用保留词new定义一个名为switch的变量,会报错.因为switch是保留词
标识符是由用户定义的符号,用途由用户决定。
inc文件中包含大量标识符定义,用户引用inc文件的行为,也等于定义了这些标识符。
标识符可以分为以下几种类型:
所有标识符都有作用域(能够使用该符号的区域)。如果两个同名变量的作用域终点相同,将导致插件编译失败(编译器无法确定使用哪个变量)。
即使作用域终点不同,在同一个函数内部也应尽量避免定义同名变量,以避免产生歧义。
// 用static定义名为index的全局变量,作用域终点位于当前文件末尾
static index;
// 定义一个函数func
public func()
{
// 用new定义名为index的局部变量,作用域终点位于 } 右花括号
// 与全局变量index的终点不同,不会报错
new index;
new var; // 作用域终点位于 } 位置
new var; // 报错!上下两个var的作用域终点相同
return index + var;
}
良好的命名规范能提高代码可读性和可维护性。以下是AMXXPawn社区中常见的命名约定:
常量通常全部大写,并用下划线分隔单词:
MAX_PLAYERS MAX_NAME_LENGTH
定义伪结构体值类型时,必须以小写字母开头:
enum sPlayer
{
结构体属性1索引常量,
结构体属性2索引常量
}
gZombie gHasWeaponMaxClients MapNameplayerEntityIndex wpnEntId attackerKills num_args函数通常全部小写用下划线分隔单词,或每个单词首字母大写:
is_user_alive get_user_weapon ArrayGetCell ExecuteHamB
myQqNumber numPlayersCsInternalModel CsTeams ArrayGetCell GetModelBoundingBoxbHasWeapon // b = bool = 布尔型
iCounter // i = int = 整数型
flCounter // fl = float = 浮点型
szMessage // sz = StringWithZeroEnd = 以终止符结尾的字符串my_name pev_teleport_time set_pev_string get_pdata_int最佳实践:命名规则应尽可能一致和规范。这能提高代码可读性,使人一看就能猜出符号的大致含义。同时,要避免使用具有歧义的符号名,以防止在开发过程中出现混淆和错误。