lua函数的警报消息

我有以下代码:

lua_getglobal(L, "lgd"); lua_getfield(L, -1, "value_pos_x"); cr->value_pos_x = lua_tointeger(L, -1); if (!lua_isinteger(L, -1)) printf("value_pos_x allows only numbers;"); lua_getfield(L, -2, "value_pos_y"); cr->value_pos_y = lua_tointeger(L, -1); if (!lua_isinteger(L, -1)) printf("value_pos_y allows only numbers;"); lua_getfield(L, -3, "time"); cr->time = lua_tointeger(L, -1); if (!lua_isinteger(L, -1)) printf("time allows only numbers;"); 

代码完美无缺。 我想知道的问题是,是否可以只保留一条消息并且适用于每个函数,例如:

 lua_getglobal(L, "lgd"); lua_getfield(L, -1, "value_pos_x"); cr->value_pos_x = lua_tointeger(L, -1); lua_getfield(L, -2, "value_pos_y"); cr->value_pos_y = lua_tointeger(L, -1); lua_getfield(L, -3, "time"); cr->time = lua_tointeger(L, -1); if (lua_tointeger(L, -1) != lua_isinteger(L, -1)) printf("The entry %s is invalid;", capture_lua_getfield_name); 

像这样的宏(在SO编辑框中未经测试和编写):

 #define GET_INTEGER_WARN(ind, fld) do { \ lua_getfield(L, ind, #fld); \ cr->fld = lua_tointeger(L, -1); \ \ if (!lua_isinteger(L, -1)) \ printf(#fld" allows only numbers;"); \ } while (0) 

会让你做这样的事情:

 lua_getglobal(L, "lgd"); GET_INTEGER_WARN(-1, value_pos_x); GET_INTEGER_WARN(-2, value_pos_y); GET_INTEGER_WARN(-3, time); 

像这样的函数(与以前一样的注意事项):

 lua_Integer get_integer_warn(lua_State *L, int ind, char *fld) { lua_getfield(L, ind, fld); if (!lua_isinteger(L, -1)) printf("%s allows only numbers", fld); return lua_tointeger(L, -1); } 

会让你做这样的事情:

 cr->value_pos_x = get_integer_warn(L, -1, "value_pos_x") cr->value_pos_y = get_integer_warn(L, -2, "value_pos_y") cr->time = get_integer_warn(L, -3, "time")