ADS 컴파일러에서 GCC컴파일러로 컴파일시 문제
안녕하세요..
주로 arm ADS의 컴파일러로 작업하다가 arm gcc 컴파일러를 써야할 필요가 있어서
과거에 작업했던 코드를 gcc로 마이그레이션을 하게 되었는데요..
예상치 못한 에러를 발견해서 문의를 드립니다.
코드를 보면 다음과 같습니다.
타입 정의 부분입니다.
/*------------------------------------------------------------------------*/
typedef struct {
void (*create)(int64 playerId, media_type mediaType, const unsigned short* URI, long contentLength);
int (*close)(_handle handle);
int (*acquire_device)(_handle handle);
int (*release_device)(_handle handle);
int (*start)(_handle handle);
int (*stop)(_handle handle);
int (*pause)(_handle handle);
int (*resume)(_handle handle);
} media_basic_interface;
typedef struct {
media_basic_interface* vptrBasic;
media_volume_interface* vptrVolume;
media_video_interface* vptrVideo;
media_snapshot_interface* vptrSnapshot;
media_midi_interface* vptrMidi;
media_record_interface* vptrRecord;
} media_interface;
static media_interface* _itfTable[] = {
&g_video_itf,
&g_audio_itf,
&g_tone_itf,
};
/*------------------------------------------------------------------------*/
그리고 매크로로 정의된 부분입니다.
/*------------------------------------------------------------------------*/
#define QUERY_BASIC_ITF(_pitf_, _method_) \
( (_pitf_) && (_pitf_)->vptrBasic && (_pitf_)->vptrBasic->##_method_ )
/*------------------------------------------------------------------------*/
여기에서 문제는 매크로를 사용한 부분에서 발생합니다.
/*------------------------------------------------------------------------*/
media_interface* pItf;
pItf = _itfTable[mediaType];
if (QUERY_BASIC_ITF(pItf, create)) { // 컴파일 에러발생 !!!
.
.
}
/*------------------------------------------------------------------------*/
그리고 에러 메시지는 다음과 같습니다.
pasting "->" and "create" does not give a valid preprocessing token multimedia.c
아마도 ads와 gcc에서 매크로를 쓰는 방법이 달라서 생기는 컴파일 에러라고 생각이 들지만
어떤식으로 변환을 시켜야 할지 모르겠습니다.
도움을 주시면 감사하겠습니다.
## 을 빼면 될 것
## 을 빼면 될 것 같습니다.
Orion Project : http://orionids.org
##을 빼면 문제가 되지 않을까요 ?
##은 문자열을 연결하기 위해 쓰이는 것으로 알고 있는데 빼도 되나요?
컴파일은 안해보고,
컴파일은 안해보고, 그냥 코드만 보고 말씀드린 거라 컴파일하면 다른 오류가 날지 모르겠습니다만, 일단 빼서 컴파일 되는지 확인해보세요.
## 이 concatenation 은 맞지만, 저 곳은 이 것을 넣을 필요가 없는 부분입니다. gcc도 그것 때문에 파싱 오류를 낸 것이라 생각되네요.
->##xxx 같은 전처리 표현은 ->xxx 를 하나의 심볼로 인식하게 만든다고 볼 수도 있는데, gcc 파싱도 그런 맥락으로 판단한다고 보여지는데요. 파서를 어떻게 구현했는가에 따라 차이는 있겠지만, 제가 보기엔 gcc 가 좀 더 정확하게 파싱한 것 같군요.
Orion Project : http://orionids.org
네.. 알겠습니다. ^^
답변 감사드립니다~
댓글 달기