2010-02-15 77 views
16

我剛剛發現這個函數定義在一些嵌入式代碼:Static關鍵字

float round_float_to_4(static float inputval); 

我熟悉的其他用途靜態(全局變量,函數和局部變量),但這是我第一次將它看作函數參數的說明符。我假設這迫使編譯器使用固定內存位置inputval而不是堆棧?

+0

海合會我得到'錯誤:參數x'指定存儲類。 – kennytm 2010-02-15 10:33:14

回答

11

這是非標準的。我猜你也是一樣,對於嵌入式目標編譯器中的這種擴展,我並不感到驚訝。

+3

你說得對。我檢查了編譯器(Microchip C18)手冊,發現:「函數參數可以具有自動或靜態存儲類型,自動參數放置在軟件堆棧中,允許重入。靜態參數在全局分配,允許直接訪問碼。」 – Josip 2010-02-15 11:14:50

4

這是無效的。其中static可以在功能參數我所知道的被使用的唯一有效的地方是在一個陣列尺寸

float round_float_to_4(float inputval[static 4]); 

話說inputval會,在這個函數的所有調用,指向內存提供至少4花車(這是C99的補充,它沒有出現在C89中)。

+1

@KennyTM,是的,它表示參數聲明等同於'int * const y':因此它改變了頂級限定。然而,'4'在沒有'靜態'的情況下,這次沒有真正的意義。 – 2010-02-15 11:07:05

1

許多嵌入式設備的堆棧嚴重受限,這樣的功能在減少堆棧溢出的機會方面具有很大的好處,同時仍爲您提供重入代碼的機會。

較小的芯片沒有任何機會將變量放入堆棧,因此所有參數都是隱式存儲器位置。

2

按照C標準,

The only storage-class specifier that shall occur in a parameter declaration is register.

相關問題