2012-04-24 3 views
0

에서 변수를 반환 나는이 C 매크로는 컴파일에 실패 이유에 조금 혼란 스러워요 :C : 만들기 및 매크로

src/event.lcpp.c:134:15: error: expected primary-expression before ‘typeof’ 
src/event.lcpp.c:134:15: error: expected ‘)’ before ‘typeof’ 
:를 호출 할 때

#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) 

, 내가 오류를 얻을

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