跳到主要内容
版本:master

gs中的宏

本文介绍gs中的常用宏。所有宏均区分大小写,且都以双下划线开头,双下划线结尾。 假设本gs文件 test.gs 位于路径 ./test_scripts/path/test.gs中, /r 设置的根目录为 ./test_scripts, 当前宏位于第 3 行, 在 test_func 函数中。

__FILE__

__FILE__ 宏展开后为相对于 /r 设置的根路径的当前文件路径 + 当前文件名。

参照假设,宏展开结果为/path/test.gs

__PURE_FILE__

__PURE_FILE__ 宏展开后为当前文件的文件名。

参照假设,宏展开结果为test.gs

__DIR__

__DIR__ 宏展开后为相对于 /r 设置的根路径的当前文件路径。

参照假设,宏展开结果为/path/

__LINE__

__LINE__ 宏展开后为当前所在的行号。

参照假设,宏展开结果为3

__LOCATION__

__LOCATION__宏展开后相当于 __FILE__ + ":" + __LINE__

参照假设,宏展开结果为/path/test.gs:3

__FUN__

__FUN__宏展开后为当前所在函数的名字。

参照假设,宏展开结果为test_func

__SRC_PREFIX__

_SRC_PREFIX__行展开后相当于 "#pragma location " + __FILE__ + ":" + __LINE__

参照假设,宏展开结果为#pragma location /path/test.gs:3

__COUNTER__

__COUNTER__宏展开后为在此之前的__COUNTER__的数量。

如下代码:

write(__COUNTER__);
write(__COUNTER__);

展开后为:

write(0);
write(1);

__result__

__result__ 严格来说是一个语法糖, 其专用于处于非entry函数的defer中,用于获取当前函数的返回值。

如下代码:

int test_ret()
{
defer {write(__result__)};
reutrn 1;
}

其中write会输出 test_ret 函数的返回结果, 即为 1, 其实际作用相当于在 test_ret 函数中插入了一个新的__result__变量, 并在return时给变量赋值,语法糖效果如下:

int test_ret()
{
mixed __result__ = nil;
defer {write(__result__)};
reutrn __result__ = 1;
}