2013-02-04 70 views
0

是否有可能定義一個宏叫IPHONE_ONLY條件編譯,看起來像這樣:您可以爲條件編譯定義函數樣式宏嗎?

IPHONE_ONLY -(void)myMethod { 
    //method body 
} 

IPHONE_ONLY(-(void)myMethod { 
    //method body 
}) 
+1

難道周圍與你'#ifdef'工作中的作用任何人的視覺的期望呢? – Shahbaz

+0

@Shahbaz它會但我正在處理一個包含大約一百個方法定義的頭文件,並且正在尋找一些在眼睛上更容易的東西(至少我的眼睛)。 – lms

回答

3

即使雖然通常你會圍繞函數#ifdef,我用gcc進行測試,實際上f以後也會起作用。我不知道它是否爲標準:

#ifdef IPHONE 
# define IPHONE_ONLY(...) __VA_ARGS__ 
#else 
# define IPHONE_ONLY(...) 
#endif 

IPHONE_ONLY(int func(void) 
{ 
    return 12; 
}) 

我從來沒有見過任何人這樣的代碼,雖然。這是很常見的寫這樣的功能是這樣的:

#ifdef IPHONE 
int func(void) 
{ 
    return 12; 
} 
#endif 

你們的編輯也將與此非常快樂,因爲它瞭解功能,而不是功能作爲宏參數的身體!

+0

這可能會奏效,但引入這樣的逗號是值得懷疑的。 – unwind

+0

@unwind的確,一個參數對於宏來說已經足夠了。儘管我不確定你的意思,以及你對什麼可能出錯的想法。 – Shahbaz

+0

+1用於指出將函數體作爲宏參數傳遞的可能性。雖然這似乎不是正確的事情。 – LihO

1

我認爲你正在尋找ifdef

#ifdef IPHONE_ONLY 
void myMethod(){ 
    //method body 
) 
#endif 
+0

Downvote?你能解釋爲什麼嗎? – LihO

0
#ifdef IPHONE_ONLY 
# define MY_METHOD() myMethod(); 
void myMethod() { 

    ...... 

} 
#else 
# define MY_METHOD() 
#endif 

在您的項目的c代碼中,您調用MY_METHOD()

這將避免你打電話那樣myMethod()每次與定義需要在你的代碼

for(i=0; i<10; i++) { 
     // some thing to do here 
#ifdef IPHONE_ONLY 
     myMethod(); 
#endif 
     // other thing to do here 
    } 

時間上面,你會以這種方式

for(i=0; i<10; i++) { 
     // some thing to do here 
     MY_METHOD(); 
     // other thing to do here 
    } 

如果IPHONE_ONLY打電話給你myMethod();被定義,則前置器將通過函數調用myMethod();

改變宏

如果IPHONE_ONLY沒有被定義,那麼預處理器將不會改變MY_METHOD()。這就像您的代碼中不存在宏調用MY_METHOD()。並且功能void myMethod()不會被定義

2

當然可以,但我不認爲這將使你的代碼更易讀

#if on_iphone 
# define IPHONE_ONLY(...) __VA_ARGS__ 
#else 
# define IPHONE_ONLY(...) 
#endif 

,然後你可以使用宏你擁有了它的第二個方法在你的問題。

但這真是醜陋和反對誰是用來讀取正確C.

相關問題