#if 常量表达式
任意注释,指令,语句
#elseif 常量表达式
任意注释,指令,语句
#else
任意注释,指令,语句
#endif
这些指令用于判断常量表达式是否满足某些条件.以便编译对应的代码.
若#if的常量表达式为真:
保留#if至#elseif中间的代码.舍弃#elseif至#else,#else至#endif中间的代码.
若#if的常量表达式为假,且#elseif的常量表达式为真:
保留#elseif至#else中间的代码.舍弃#if至#elseif,#else至#endif中间的代码.
若#if和#elseif的常量表达式都为假:
保留#else至#endif中间的代码.舍弃#if至#elseif,#elseif至#else中间的代码.
#elseif和#else是可选的,且#elseif的数量没有限制.
编译分支指令是可以嵌套的.每一个#if都必须与一个#endif配对.
示例:
#include amxmodx
const gPluginVersion1 = 1; // 主版本号
const gPluginVersion2 = 0; // 次版本号
const gPluginVersion3 = 0; // 修订号
// ↓第1层起点
#if (0 < gPluginVersion1)
// ↓第2层起点
#if (0 <= gPluginVersion2 && gPluginVersion2 < 10)
// ↓第3层起点
#if (0 <= gPluginVersion3 && gPluginVersion3 < 10)
static const gPluginVersion[] = { '0' + gPluginVersion1, '.', '0' + gPluginVersion2, '.', '0' + gPluginVersion3, EOS };
#else
// 报错:gPluginVersion3的有效值是0至9
#error "The valid values for gPluginVersion3 are 0 to 9"
#endif
// ↑第3层终点
#else
// 报错:gPluginVersion2的有效值是0至9
#error "The valid values for gPluginVersion2 are 0 to 9"
#endif
// ↑第2层终点
#else
// 报错:gPluginVersion1必须大于0
#error "The value of gPluginVersion1 must be greater than 0"
#endif
// ↑第1层终点
public plugin_init()
{
register_plugin("测试插件", gPluginVersion, "插件作者");
server_print("[AMXX]插件版本 = %s", gPluginVersion);
}
若将"主版本号"设置为小于1的值,编译时会触发第1层#else下的报错:
Error: User error: "The value of gPluginVersion1 must be greater than 0" on line 26
若将"次版本号"设置为小于0或大于9的值,编译时会触发第2层#else下的报错:
Error: User error: "The valid values for gPluginVersion2 are 0 to 9" on line 21
若将"修订号"设置为小于0或大于9的值,编译时会触发第3层#else下的报错:
Error: User error: "The valid values for gPluginVersion3 are 0 to 9" on line 16
若版本号3个值全部合规,则会满足第1,2,3层#if的条件,并定义gPluginVersion数组,逐步编译第3,2,1层#endif下的代码.
进入游戏后,按下 [~] 按键打开控制台,可以看见打印结果:
[AMXX]插件版本 = 1.0.0
需要注意,编译分支指令的常量表达式中不能填写无效代码或者变量表达式,因为表达式结果必定为假.