“Char s [statik 10]” gibi işlev dizisi parametresindeki statik anahtar kelimenin amacı nedir?


144

Bazı kaynak kodlarına göz atarken şöyle bir fonksiyonla karşılaştım:

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

Bazı denemelerle, orada başka niteleyiciler de görünebilir:

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

Niteleyicilere yalnızca [ ]dizi bir işlevin parametresi olarak bildirildiğinde izin verilir . Bunlar ne yapıyor? Fonksiyon parametreleri için neden farklı?

Yanıtlar:


127

İlk beyan derleyici söyler someArrayolduğu en az 100 elementler uzun. Bu optimizasyonlar için kullanılabilir. Örneğin, bunun someArrayasla olmadığı anlamına da gelir NULL.

C Standardının, işleve yapılan bir çağrı bu gereksinimleri karşılamadığında derleyicinin tanı koymasını gerektirmediğini unutmayın (yani, sessiz tanımsız davranıştır).

İkinci deklarasyon sadece someArray( someArrayelementler değil !) Const olarak bildirilir, yani yazamazsınız someArray=someOtherArray. Parametre ile aynıdır char * const someArray.

Bu sözdizimi yalnızca []bir işlev parametre listesindeki bir dizi bildiricisinin en iç kısmında kullanılabilir ; diğer bağlamlarda mantıklı olmazdı.

Yukarıdaki durumların her ikisini de kapsayan Standart metin C11 6.7.6.3/7'de (C99'da 6.7.5.3/7 idi):

Bir parametrenin '' tür dizisi '' olarak bildirilmesi, tür niteleyicilerinin (varsa) dizi türü türetme içinde [ve ]bu tür türünde belirtilenler olduğu '' tür için nitelikli işaretçi '' olarak ayarlanacaktır . Statik anahtar sözcüğü , dizi türü türevinin içinde [ve ]türünde de görünüyorsa , işleve yapılan her çağrı için, karşılık gelen gerçek bağımsız değişkenin değeri, bir dizinin ilk öğesine, en az boyut ifadesi.


35
Bu konu üzerinde: Ben kullanmayı tercih düşünülmelidir acaba int foo(struct bar [static 1]);yerine int foo(struct bar *);NULL işaretçileri kabul etmiyoruz fonksiyonlar için imza olarak. (Ben gcc derleyici uyarı verebilir böylece bu tür işlevleri işaretlemek için standart olmayan bir sözdizimi olduğunu biliyorum ..)
— R. .. GitHub DURDURMAK ICE

2
Ben sadece gcc ve clang kontrol ettik ve ben 0 ile karşılaştırmak için onlara sormak ne zaman someArray her zaman null olmadığını varsayalım Ayrıca C99 tanımlayan kesin maddeyi bulmak için mücadele. 6.7.5.3-21'de amaçlanan anlamdan bahseden bir not var ve hepsi bu. Buna güvenebileceğimizden şüpheliyim. Dahası, tüm bunlar fonksiyon imzasının bir parçası değildir, bu yüzden onu zorladığımız pek bir şey yoktur.
— Nordic Mainframe

5
Bu bağlantı çürümüş gibi görünüyor, işaret ettiği şey bu mu? pic.dhe.ibm.com/infocenter/zos/v1r12/…
— Ross Aiken

13
@ NordicMainframe: Bir süre geçti, ancak clangbilinen bir NULL argümanını [static 1]parametre bildirimli bir işleve geçirmeye çalıştığınızda şu anki geçerli sürümü doğru şekilde uyarıyor .
— dreamlax

1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功if (!someArray) { somecode... }kaldırılabilir
— MM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.