2017-07-01 165 views
1

我用這個宏:傳遞數組作爲宏參數

#define ISALPHA(text[i]) ('a'<=a && a<= 'z')|| ('A'<=a && a<= 'Z')? ("alpha"):("not alpha") 

它給此錯誤:[Error] "[" may not appear in macro parameter list。 如何在C中的宏中提供數組值作爲參數?

+2

使用庫函數'isalpha'有什麼問題?在任何情況下,'text [i]'應該在宏調用中,而不是它的定義。 '#define ISALPHA(a)...' –

+1

如何傳遞數組在這裏不是問題,因爲這不是你正在做的事情。你測試一個字符。 – Clifford

回答

3

有你的代碼中的多個漏洞,但答案的標題問題是,您在宏參數列表中使用普通的名字:

#define ISALPHA(c) ((('a' <= (c) && (c) <= 'z') || \ 
        ('A' <= (c) && (c) <= 'Z')) ? "alpha" : "not alpha") 

然後,使用調用上數組元素的宏:

ISALPHA(text[i]) 

請注意在宏中大量使用括號以避免奇數球宏參數的問題。

遠遠高於所有的測試更好,雖然,是使用isalpha()宏從<ctype.h>標準(語言環境敏感):在您的版本

#define ISALPHA(c) (isalpha(c) ? "alpha" : "not alpha") 

錯誤包括:

  • 使用text[i]而不是在宏參數中的a
  • 括號內不包含a的用法。
  • 不用圓括號括住整個宏。
  • (次要)對於某些代碼集(例如IBM大型機上使用的EBCDIC),測試字符是否爲字母是不準確的。

將括號括在括號中是不必要的,但不會造成任何麻煩。

我選擇使用c作爲「角色」的助記符是文體或個人偏好;使用a一致(對於'字母',大概)也可以。

+2

我建議最大的錯誤是定義和使用宏的行爲......這完全沒有必要,因爲語言提供了更安全的功能來實現相同的效果。 – Peter

0

爲什麼不使用ctype.h中聲明的isalpha。它比使用宏更安全。不要誤解我的意思,宏是很好的工具,只要你知道你在做什麼,但是經常你可能以未定義的行爲結束,而你卻沒有意識到它。

我見過這樣的事情(在第三方庫)

#define min(x,y) ((x)<(y)?(x):(y)) 

似乎不錯,但事實並非如此。後來,當你不知道你在做什麼,你可以做這樣的事情:

int something(int x, int y) 
{ 
    return min(x++, y); 
} 

它擴展到

int something(int x, int y) 
{ 
    return ((x++)<(y)?(x++):(y)); 
} 

和產量不確定的行爲。

+0

這是我學位課程c模塊的考試試題中的一個問題,所以我需要特別使用宏:-( –