0

この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’

typeof(lua_to##type)だけに置き換えると同じことが起こるintので、問題はコンマに関係しているのではないかと思います。このような式の途中で変数を宣言することはできませんか?

gccにはブロックから値を返すための拡張機能があることは知っていますが、コンパイラー拡張機能は避けたいと思います。また、これをインライン関数に変更する必要があることも理解していますが、マクロが機能しない理由に興味があります。

4

1 に答える 1

1

実際、標準Cでは、式内で新しい変数を任意に定義することはできません。古い標準では、ブロックの先頭以外では許可されていませんでした(つまり、ステートメントと混合することもできませんでした)。

于 2012-04-24T05:58:44.610 に答える