2012-12-03 31 views
3

__attribute__((const))是一個GCC歸屬地,用於檢查函數執行的純度。 我認爲這是Clang支持的,但是當我把它放在一個方法中時,它似乎不起作用。__attribute __((const))與Clang一起使用Objective-C方法嗎?

@interface C1 
- (id)method1 __attribute__((const)); 
@end 


int a = 0; 

@implementation C1 
- (id)method1 __attribute__((const)) 
{ 
    a++; 
    return nil; 
} 
@end 

上面的代碼不會生成任何警告或錯誤。

此歸屬於Clang嗎?或者我應該怎麼做才能使其發揮作用?

+0

我試圖清理[tag:pure]標籤,它有時指[純](http://beebole.com/pure/)或[純](http://en.wikipedia .org/wiki/Pure_(programming_language))或「純CSS」。我不知道Objective C,所以如果我的編輯沒有意義,請讓我知道。 –

+0

@RichardJPLeGuen我把標籤更新爲'純度',這很合理。 Objective-C不支持純虛擬函數作爲語言結構,但行爲可以通過動態檢查來模擬。 – Eonil

+0

太棒了!謝謝! –

回答

8

const屬性不檢查函數的純度。它聲明瞭函數的純度,所以優化器可以消除對函數的調用。實際上確保函數是純粹的由你決定。

2

聲明方法const無法在Objective-C中工作,因爲它與運行時的消息傳遞機制相矛盾。 The documentationconst說:

注意,具有指針參數和檢查數據指出,一定不能用const聲明功能。

每個Objective-C方法至少有一個(隱式)指針參數:self。它是總是作爲消息傳遞的一部分進行了檢查(objc_msgSend())。這就是Objective-C動態的原因。

+0

我確定'__attribute __((const))'和'const'關鍵字是不同的東西。 – Eonil

+0

@Eonil我應該清楚說明我正在討論裝飾函數的gcc擴展:'__attribute __((const))'。 –

+0

感謝您澄清它。現在我很困惑,因爲當我問這個問題時,它根本沒有提出任何警告或錯誤。現在我假設Clang只是默默地忽略了Objective-C方法的屬性。 – Eonil

相關問題