gcc버젼이 2.95에서 상위버젼으로 바뀌면서 #define에서 (##)의
말그대로 상위버젼으로 가면서 #define에서 더이상 ##를 사용하지 말라고 하네요
http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html#Concatenation
그래서 상위버젼에서 실행할수 있도록 수정을 해야하는데 도저히 엄두가 나지 않습니다
typedef struct {
char szASvrAddr[20]; /* A서버 어드레스 */
int nASvrPort;
char szBSvrAddr[20]; /* B서버 어드레스 */
int nBSvrPort;
} SUserParm_T;
typedef struct itemdata_t {
int itemposi;
int itemsize;
int (*itemfunc)(char *, struct itemdata_t *, char *);
char *(*viewfunc)(char *, struct itemdata_t *, char *);
int defvalue;
} itemdata_t;
static int ITEM_STRING(char *pUser,itemdata_t *itemdata,char *pdatastr)
{
return(0);
}
static char *VIEW_STRING(char *pUser,itemdata_t *itemdata,char *pdatastr)
{
return(pUser + itemdata->itemposi);
}
static int ITEM_NUMBER(char *pUser,itemdata_t *itemdata,char *pdatastr)
{
return(0);
}
static char *VIEW_NUMBER(char *pUser,itemdata_t *itemdata,char *pdatastr)
{
return(pdatastr);
}
#define SET_ITEMDATA(itemname,itemdata,funcbase,defval) { \
itemname, \
offsetof(SUserParm_T,itemdata), \
sizeof(((SUserParm_T *)0)->##itemdata), \
ITEM_##funcbase, \
VIEW_##funcbase, \
defval \
}
static itemdata_t itemdata_tab[] = {
SET_ITEMDATA("ASVRADDR", szASvrAddr , STRING, 0x00),
SET_ITEMDATA("ASVRPORT", nASvrPort , NUMBER, 0x00),
SET_ITEMDATA("BSVRADDR", szBSvrAddr , STRING, 0x00),
SET_ITEMDATA("BSVRPORT", nBSvrPort , NUMBER, 0x00),
};
조금만 도와주세요
Re: gcc버젼이 2.95에서 상위버젼으로 바뀌면서 #define에서 (##
말씀하신 링크를 읽어봤는데 쓰지 말라는 말이 전혀 없는데요?
C89 이상 C 표준에서 보장되는 내용이니까 안심하고 쓰셔도 상관없습니다.
다만,
부분은
로 쓰셔야 할 듯 싶습니다.
-> 와 itemdata 에 전달된 아규먼트를 합하면 valid processing token이 아니기 때문에 (ex> ->nASvrPort ) 그 결과는 undefined 되어있습니다.
링크된 gcc 페이지에서는 이 경우에 경고를 발생하고 두 개를 별개의 토근으로 emit 한다고 되어있습니다.
(예전 버젼에서는 경고도 발생시키지 않았었는데 변경되었나 봅니다.)
올려주신 코드에서는 ## 가 필요없는 경우이기 때문에 경고만 발생하고 컴파일과 실행 모두 정상적으로 될 것입니다.
댓글 달기