2013-02-09 70 views
0

嘿看看代碼:MACRO錯誤使用switch語句時

#define SUFFIX(n) (switch(n)            \ 
        {              \ 
         case 1: printf("st\n");        \ 
         break;            \ 
                      \ 
         case 2: printf("nd\n");        \ 
         break;            \ 
                      \ 
         case 3: printf("rd\n");        \ 
         break;            \ 
        }              \ 
        )               

調用上面的宏主:

int main() 
{ 
    printf("%s", suffix(1)); 
} 

但是,當我把這個我得到一個錯誤信息:

expected expression before switch 

但我缺少什麼表達方式?

+1

我覺得你很混淆表達式和語句以及GNU複合表達式...... – 2013-02-09 23:03:14

+1

你想要一個函數,而不是宏。 – Gabe 2013-02-09 23:04:03

+0

會發生什麼如果我使用宏。我認爲functio的開銷會在每次調用它的時候殺掉一些時間,爲什麼不使用宏呢?只是要求BTW – user1971996 2013-02-09 23:05:15

回答

4

你想要做的事情將無法工作。 switch是一個聲明,但printf需要一個表達式。

選項1:

#define沒有printf刪除括號(),簡單地說SUFFIX(1)

#define SUFFIX(n) switch(n)            \ 
        { case 1: printf("st\n"); break;      \ 
        case 2: printf("nd\n"); break;      \ 
        case 3: printf("rd\n"); break;      \ 
        } 
int main() 
{ 
    SUFFIX(1); 
} 

選項2:

#define SUFFIX(n) (n == 1 ? "st" : (n == 2 ? "nd" : (n == 3 ? "rd" : ""))) 
int main() 
{ 
    printf("%s", SUFFIX(1)); 
} 

選項3和4:

製作的一個函數上方的一個。第一個返回void,第二個返回char *

+0

你一定是C神,非常感謝,我犯這個錯誤有多愚蠢! – user1971996 2013-02-09 23:17:09

+0

順便說一句我應該使用這個宏還是一個函數? – user1971996 2013-02-09 23:17:41

+0

是啊,非常感謝,第一個選項工作。我應該使用宏還是函數? – user1971996 2013-02-09 23:21:45