处理操作系统差异
当编写跨平台的应用或库时,通常需要考虑到操作系统之间的差异。变量 Sys.KERNEL 可以用于这些场合。在 Sys 模块中有一些函数将会使这些事情更加简单:isunix、 islinux、isapple、isbsd、isfreebsd 以及 iswindows。这些函数可以按如下方式使用:
1. if Sys.iswindows()
2. windows_specific_thing(a)
3. end
注意,islinux、isapple 和 isfreebsd 是 isunix 完全互斥的子集。另外,有一个宏 @static 可以使用这些函数有条件地隐藏无效代码,如以下示例所示。
简单例子:
1. ccall((@static Sys.iswindows() ? :_fopen : :fopen), ...)
复杂例子:
1. @static if Sys.islinux()
2. linux_specific_thing(a)
3. else
4. generic_thing(a)
5. end
在链式嵌套的条件表达式中(包括 if/elseif/end),@static 必须在每一层都调用(括号是可选的,但是为了可读性,建议添加)。
1. @static Sys.iswindows() ? :a : (@static Sys.isapple() ? :b : :c)
