“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.