我对为什么这个 C 宏编译失败有点困惑:
#define LUA_GET_FIELD(Lua, idx, name, type) (
lua_getfield((Lua), (idx), (name)),
typeof(lua_to##type) __result = lua_to##type((Lua), -1),
lua_pop((Lua), 1), __result)
调用它时,我收到错误:
src/event.lcpp.c:134:15: error: expected primary-expression before ‘typeof’
src/event.lcpp.c:134:15: error: expected ‘)’ before ‘typeof’
如果我只用 int
替换typeof(lua_to##type)
也会发生同样的情况,所以我怀疑问题与逗号有关。您不能在这样的表达式中间声明变量吗?
我知道 gcc 有一个从块返回值的扩展,但我想避免编译器扩展。我也意识到这应该更改为内联函数,但现在我很好奇为什么宏不起作用。
标准 C 确实不允许你在表达式中任意定义新变量。 较旧的标准甚至不允许它们在任何地方使用,而是在块的开头(也就是说,您也不能将它们与语句混合在一起)。