Function () ve function (void) arasındaki fark nedir?


27

Bunun gibi bir parametre olarak hiçbir şey almayan fonksiyonlar yazmanın iyi bir uygulama olduğunu duydum:

int func(void);

Ama bunu ifade etmenin doğru yolunun böyle olduğunu duydum:

int func();

Hem C hem de C ++ 'da bu iki işlev bildirimi arasındaki fark nedir?


5
Bu, site ağındaki diğer binlerce sorunun bir kopyası, diğerleri arasında stackoverflow.com/questions/18167390/…
Lars Viklund

@LarsViklund bu sitede bir soru varsa, sadece bir kopyasıdır. Bir tane bulamıyorum, bu yüzden SO'da ne olduğuna bakılmaksızın, bu bir kopya değil. Muhtemelen bu soruyu başka bir şey yapmazsa bir tabela olarak tutmaya değer.


1
@LightnessRacesinOrbit sohbette konuştuk ve bazı düzenlemelerle etrafta kalmaya karar verdik.

Yanıtlar:


17

C ve C ++ bu açıdan farklıdır.

C 2011 Çevrimiçi Standardı

6.7.6.3 İşlev bildirgeleri (prototipler dahil)
...
10 voidListedeki tek öğe olarak adlandırılmamış bir parametrenin özel durumu , işlevin parametre olmadığını belirtir.
...
14 Bir tanımlayıcı listesi sadece fonksiyon parametrelerinin tanımlayıcılarını bildirir. Bir işlev bildirgesinde, bu işlevin tanımının bir parçası olan boş bir liste, işlevin parametresi olmadığını belirtir. Bir işlev bildirgesinde, bu işlevin tanımının bir parçası olmayan boş liste, parametre sayısı veya türleri hakkında hiçbir bilgi verilmeyeceğini belirtir. 145)

Kısacası, bir işlev bildirimindeki boş bir parametre listesi , işlevin belirtilmemiş sayıda parametre aldığını belirtirken, işlev tanımındaki boş bir parametre listesi , işlevin parametre almadığını gösterir.

T foo( void ); // declaration, foo takes no parameters
T bar();       // declaration, bar takes an *unspecified* number of parameters

T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... }       // definition, bar takes no parameters

C ile ilgili olarak, hiçbir fonksiyon bildirimi veya tanımında boş bir tanımlayıcı listesi kullanmamalısınız . Bir fonksiyonun herhangi bir parametre alması gerekmiyorsa, bunu voidparametre listesinde kullanarak belirtin .

Çevrimiçi C ++ standardı

8.3.5 İşlevler [dcl.fct]
...
4 parametre-bildirim-cümlesi , işlev çağrıldığında belirtilebilecek argümanları ve işlemlerini belirler. [ Not: parametre bildirimi-maddesi işlev çağrısı belirtilen argümanlar dönüştürmek için kullanılır; 5.2.2'ye bakınız. - son not ] Parametre-bildirge-yan tümcesi boşsa, fonksiyon bağımsız değişken almaz. Bağımlı olmayan türde tek bir adsız parametreden oluşan bir parametre listesi void, boş bir parametre listesine eşdeğerdir. Bu özel durum dışında, bir parametrenin tipi olmayacaktır cv void. Eğer parametre-beyan-fıkrabir üç nokta veya bir işlev parametresi paketi (14.5.3) ile sonlanır, bağımsız değişkenlerin sayısı, varsayılan bir değişken içermeyen ve işlev parametre paketleri olmayan parametre sayısına eşit veya daha büyük olmalıdır. Sözdizimsel olarak doğru olan ve “...” soyut bildirgenin bir parçası olmadığı durumlarda , “, ...” “...” ile eşanlamlıdır. [ Örnek: beyan
    int printf(const char*, ...);
değişken sayılar ve argüman tipleri ile çağrılabilecek bir fonksiyon bildirir.
    printf("hello world");
    printf("a=%d b=%d", a, b);
Bununla birlikte, ilk argüman dönüştürülebilen bir tipte olmalıdır const char*- uç örneği ] [ Not: standart başlık <cstdarg>üç nokta kullanılarak geçirilen erişmek bağımsız değişkenler için bir mekanizma ihtiva eder (5.2.2 ve 18.10 bakınız). - son not ]

C ++ durumunda, bir bildirimdeki veya tanımdaki boş bir parametre listesi, işlevin argüman almadığını ve parametre listesiyle eşdeğer olduğunu gösterir void.


35

C'de, boş bir parametre listesine sahip bir fonksiyon bağımsız değişkenleri ()için her şeyi alabilir . Kelimenin tam anlamıyla bir şey. Bu genellikle değişken sayıda argüman alabilen bir işlevi uygulamak için kullanılır , ancak bu günlerde (...)bu işlevler için daha belirgin elips sözdizimini kullanmak tercih edilir .

C'de, parametre listesi olan bir işlev (void)açıkça argümanları için hiçbir şey almaz. Bu, bir şeyi iletmeye çalışırsanız derleyici size bir hata yaptığınızı söyleyebilir.

C ++ 'da, bu işlev bildirimleri eşdeğerdir. Boş bir parametre listesi, aynı şekilde "parametre yok" anlamına gelir void.


Re: "Bu genellikle değişken sayıda argüman alabilen bir işlevi uygulamak için kullanılır": Bundan emin misiniz? Değişken olmayan işlevlerin ileri bildirimleri ()için ve değişken değişkenlerin bildirimleri için açık parametre listeleri kullanan bir program gördüğümü sanmıyorum . Bu sözleşmeyi kullanan bir program örneğiniz var mı?
ruakh

4
AC variadic fonksiyon gerekir ile tanımlanabilir ...sözdizimi ve en az bir adlandırılmış parametre olması gerekir. Böyle bir işlevi tanımlamak ()tanımsız davranışa neden olur - ve fonksiyon gövdesinde <stdarg.h>parametre değerlerini okumak için tanımlanan makroları kullanmanın bir yolu yoktur . 1989/1990 standardından bu yana durum böyle olmuştur.
Keith Thompson,

@KeithThompson: Bu soru ve bu cevap, fonksiyon tanımlarından değil, önceki açıklamalardan bahsediyor.
ruakh

3
@ruakh: Tanımlanamayan davranışlardan kaçınmak için değişken bir işlev bildirilmeli ve... sözdizimi kullanılarak tanımlanmalıdır.
Keith Thompson,
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.