Kullanılmayan bir fonksiyon parametresi değerini neden void'e çevirelim?


98

Bazı C projelerinde şu kodu gördüm:

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

İptal edilecek iki yayın herhangi bir amaca hizmet ediyor mu?


Doğru cevap (kullanılmayan parametrelerle ilgili derleyici uyarılarını engellemek) Charles'ın bağlantılı sorusundadır.
TED

@Cody Gray - Bu nedenle kapatıldı. Ancak aslında bu sorunun bir kopyası değildi. 689677, dönüşleri parametrelere değil, boşluğa atamaktan bahsediyordu.
TED

19
Aslında her iki kopya da bu soru için geçerli değil. Biri C ++, diğeri dönüş değerleri ile ilgili. Bunlar aynı şeyler değil . Herhangi bir C parametresi kopyası var mı?
Matt Joiner

2
Bu, önerilen kopyaların kapsadığından farklı bir sorudur. Yine de hatanın neden yapıldığını anlayabiliyorum. Yeniden açıldı (belli ki).
Tim Post

4
Dikkat: Lütfen bunu bir C ++ sorusunun bir kopyası olarak kapatmayın, çünkü C ++ (void)biraz farklı bir etki için kullanır . Bu soru C ile ilgili
Antti Haapala

Yanıtlar:


89

Bazı parametreler kullanılmadığı için derleyiciden gelen uyarıları önlemek için oradadır.



@Benoit void'e döküm yapmak aslında ne işe yarar? Tek işlevi derleyiciye bir şeyi kasıtlı olarak görmezden geldiğinizi veya gerçekten bir şey yaptığını (void) ve derleyici bunu gördüğünde, onu değişkenle bir şeyler yapmış olarak sayacak ve bu nedenle bir uyarı vermeyecektir mi?
Tan Wang

2
@TanWang Tek işlevi derleyiciye bir şeyi kasıtlı olarak görmezden geldiğinizi göstermektir. Çalışma zamanında hiçbir şey yapmaz.
zwol

14

Prototipte kullanılmayan parametrelere sahip olmanın nedeni genellikle işlevin bazı harici API'lere uyması gerektiğidir - belki de bir kitaplık işlevidir veya bu işleve bir işaretçi, bu çağrı kuralını bekleyen başka bir işleve geçirilir. Ancak, çağırma kuralı tarafından kullanılan tüm argümanlara aslında işlevin kendisinde ihtiyaç duyulmaz.

Gövde kısmında parametre isminden bahsetme sebebi , aşağıdaki gibi uyarılardan kaçınmaktır

unused.c: In function l_alloc’:
unused.c:3:22: warning: unused parameter ud [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

Bu uyarı , işlev gövdesindeki gerçek parametre kullanılarak bastırılabilir. Örneğin, aşağıdaki ifadeye sahipseniz:

ud;

Bu uyarı artık bastırılmıştır. Ancak şimdi GCC başka bir uyarı üretecek :

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

Bu uyarı, ud;sözdizimsel olarak geçerli olan C ifadesinin hiçbir şeyi etkilemediğini ve muhtemelen ifadeden farklı olarak bir hata olduğunu söyler.

abort;

belki de abort();bunun yerine bir şeyler yapması için yazılması gerekirdi .

İşte burada (void)oyuncu kadrosu devreye giriyor - derleyiciye açık ve net bir şekilde ifadenin kesinlikle hiçbir etkisinin olmaması gerektiğini söyleyecektir.

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.