|
On 22/10/2011 15:03, liam mail wrote:
I propose to rewrite the macro with something like: #define lua_getglobal(L,s) \ do { const char* S=s; lua_pushglobaltable(L); lua_getfield(L, -1, S); lua_remove(L, -2); } while(0) Yes this is correct as you are using a relative rather than absolute address and your proposed solution looks good for relative indexes, although I would question the do while block. The do while block scope is recommended by numerous FAQs, books et al, yet with a high enough compiler warning level and the wrong compiler it will generate user warnings in code. *
The 'do {} while(0)' trick is not just about limiting scope, its primary purpose is to guarantee that you can safely use the macro like a regular function in all contexts. Without the dummy loop you'd get unexpected results e.g. when using:
if (foo) lua_getglobal(L, x);I'd also expect the trick to be common enough to not generate a warning in most compilers, but that's only a guess. There is however another potential source of warnings: The variable 'S' might shadow another identifier declared outside. It should at least be changed to a less commonly used name.
I guess the only safe solution is to make lua_getglobal() a real function. Regards, Ingo