Apa tujuan dari kata kunci statis dalam parameter array fungsi seperti "char s [static 10]"?

144

Saat menelusuri beberapa kode sumber saya menemukan fungsi seperti ini:

void someFunction(char someArray[static 100])
{
    // do something cool here
}

Dengan beberapa eksperimen, tampaknya kualifikasi lain juga dapat muncul di sana:

void someFunction(char someArray[const])
{
    // do something cool here
}

Tampaknya kualifikasi hanya diizinkan di [ ]dalam array ketika dinyatakan sebagai parameter fungsi. Apa yang dilakukan ini? Mengapa berbeda untuk parameter fungsi?

dreamlax
sumber

Jawaban:

127

Deklarasi pertama memberitahu compiler bahwa someArrayadalah setidaknya 100 elemen panjang. Ini dapat digunakan untuk optimisasi. Misalnya, itu juga berarti someArraytidak pernah NULL.

Perhatikan bahwa Standar C tidak memerlukan kompiler untuk mendiagnosis ketika panggilan ke fungsi tidak memenuhi persyaratan ini (yaitu, itu adalah perilaku terdefinisi diam).

Deklarasi kedua hanya menyatakan someArray(bukan someArrayelemen!) Sebagai const, yaitu, Anda tidak dapat menulis someArray=someOtherArray. Itu sama seperti jika parameternya char * const someArray.

Sintaks ini hanya dapat digunakan di bagian terdalam []dari deklarator array dalam daftar parameter fungsi; itu tidak masuk akal dalam konteks lain.

Teks standar, yang mencakup kedua kasus di atas, ada di C11 6.7.6.3/7 (adalah 6.7.5.3/7 di C99):

Deklarasi parameter sebagai '' array tipe '' harus disesuaikan dengan '' pointer berkualitas untuk mengetik '', di mana kualifikasi tipe (jika ada) adalah yang ditentukan dalam [dan ]dari derivasi tipe array. Jika kata kunci statis juga muncul di dalam [dan ]dari derivasi tipe array, maka untuk setiap panggilan ke fungsi, nilai argumen aktual yang sesuai harus menyediakan akses ke elemen pertama dari array dengan setidaknya sebanyak elemen yang ditentukan oleh ekspresi ukuran.

Mainframe Nordik
sumber
35
Pada topik ini: Saya bertanya-tanya apakah itu harus dianggap lebih baik untuk digunakan int foo(struct bar [static 1]);daripada int foo(struct bar *);sebagai tanda tangan untuk fungsi yang tidak menerima pointer NULL. (Saya tahu gcc memiliki sintaks tidak standar alternatif untuk menandai fungsi-fungsi seperti itu sehingga kompiler dapat memberikan peringatan ..)
R .. GitHub STOP HELPING ICE
2
Saya baru saja memeriksa gcc dan dentang dan tidak berasumsi bahwa someArray selalu non null ketika saya meminta mereka untuk membandingkan terhadap 0. Juga saya berjuang untuk menemukan klausa yang tepat di C99 yang mendefinisikannya. Ada catatan dalam 6.7.5.3-21 yang menyebutkan arti yang dimaksudkan dan hanya itu. Saya ragu kita bisa mengandalkan ini. Selain itu, semua ini bukan bagian dari tanda tangan fungsi, jadi tidak banyak yang kami laksanakan melalui itu.
Nordic Mainframe
5
Tautan itu tampaknya telah membusuk, apakah ini yang ditunjukkannya? pic.dhe.ibm.com/infocenter/zos/v1r12/…
Ross Aiken
13
@NordicMainframe: Sudah lama, tetapi versi clangsaat ini memperingatkan dengan benar ketika Anda mencoba untuk melewati argumen NULL-dikenal ke fungsi dengan [static 1]deklarasi parameter.
dreamlax
1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功if (!someArray) { somecode... }dapat dihapus
MM