从C中找到Lua数的符号

时间:2014-11-24 11:34:42

标签: c lua

我有一个似乎微不足道的问题。

让我们说在Lua堆栈的顶部有一个数字。我想找出(在C中)这个数字是正数,负数还是零。

一个天真的解决方案是:

lua_Number num = lua_tonumber(L, -1);
if (num > 0)
   print("positive")
else if (num < 0)
   print("negative")
else
   print("zero")

然而,这在Lua 5.3中可能效果不佳,因为如果它是堆栈上的Lua整数(lua_Integer),它可能不适合我们的num变量(即lua_Number)。

那么如何编写我的C代码以在Lua 5.1 / 5.2和Lua 5.3中工作?

(顺便说一句,我之所以只对符号感兴趣,而不是对数字本身感兴趣,是因为这个数字是排序算法的比较函数的返回值。它的结果是比较两个项目。)

1 个答案:

答案 0 :(得分:3)

一种可能的解决方案是让Lua为您进行比较。这可以使用lua_compare(或lua_lessthan,LuaJIT和Lua 5.1)来完成:

#if LUA_VERSION_NUM == 501
  #define LUA_LESS_THAN(state, index1, index2) lua_lessthan(state, index1, index2)
#elif LUA_VERSION_NUM > 501
  #define LUA_LESS_THAN(state, index1, index2) lua_compare(state, index1, index2, LUA_OPLT)
#endif

lua_pushnumber(L, 0);
if (LUA_LESS_THAN(L, -1, -2)) {
  // 0 < num
} else if (LUA_LESS_THAN(L, -2, -1)) {
  // 0 > num
} else {
  // 0 == num
}
lua_pop(L, 1);