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 한다고 되어있습니다.
(예전 버젼에서는 경고도 발생시키지 않았었는데 변경되었나 봅니다.)
올려주신 코드에서는 ## 가 필요없는 경우이기 때문에 경고만 발생하고 컴파일과 실행 모두 정상적으로 될 것입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.