gcc버젼이 2.95에서 상위버젼으로 바뀌면서 #define에서 (##)의

dudtns0의 이미지

말그대로 상위버젼으로 가면서 #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),
};

조금만 도와주세요

최종호의 이미지

말씀하신 링크를 읽어봤는데 쓰지 말라는 말이 전혀 없는데요?
C89 이상 C 표준에서 보장되는 내용이니까 안심하고 쓰셔도 상관없습니다.

다만,

dudtns0 wrote:

#define SET_ITEMDATA(itemname,itemdata,funcbase,defval) { \
...
sizeof(((SUserParm_T *)0)->##itemdata),
...
}

부분은

#define	SET_ITEMDATA(itemname,itemdata,funcbase,defval)	{	\
...
			sizeof(((SUserParm_T *)0)->itemdata),		
...
}

로 쓰셔야 할 듯 싶습니다.
-> 와 itemdata 에 전달된 아규먼트를 합하면 valid processing token이 아니기 때문에 (ex> ->nASvrPort ) 그 결과는 undefined 되어있습니다.
링크된 gcc 페이지에서는 이 경우에 경고를 발생하고 두 개를 별개의 토근으로 emit 한다고 되어있습니다.
(예전 버젼에서는 경고도 발생시키지 않았었는데 변경되었나 봅니다.)
올려주신 코드에서는 ## 가 필요없는 경우이기 때문에 경고만 발생하고 컴파일과 실행 모두 정상적으로 될 것입니다.