2012-04-24 12 views
0

で変数を作成して返す:C:私はこの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にはブロックから値を返す拡張機能がありますが、コンパイラの拡張機能を避けたいと思います。私はこれもインライン関数に変更する必要があることを認識していますが、なぜ今マクロが機能しないのか不思議です。

+0

'typeof(lua_to ## type) 'という式は' lua_to ## type'関数が返す型ではなく、関数型に評価されます。 –

+0

"コンパイラ拡張を避けたい" - 'typeof'はコンパイラの拡張機能なので、それを使用したい場合は次のステップを踏むのが悪くないかもしれません。 –

+0

Dratは、それを恐れていました。 :| – Rena

答えて

1

標準Cでは、式の中に新しい変数を任意に定義することはできません。古い標準では、ブロックの開始時にはどこでも許可されませんでした(つまり、ステートメントと混在させることはできません)。

+0

'typeof'もGCC拡張です(C11に追加されていない限り)。 – Mat

+0

@Mat:これはありません。 –

+0

@Mat:C言語の 'typeof'は言語に反しませんか?強いタイピングではないので。型の概念は、他のほとんどの言語と比べて少し異なります。 – Morpfh

関連する問題