Yanıtlar:
İçinde C :
void foo()
" foo
belirtilmemiş türde belirtilmemiş sayıda argüman alan bir işlev " void foo(void)
" foo
bağımsız değişken almayan bir işlev" anlamına gelirGelen C ++ :
void foo()
" foo
bağımsız değişken almayan bir işlev" anlamına gelirvoid foo(void)
" foo
bağımsız değişken almayan bir işlev" anlamına gelirBu foo(void)
nedenle, yazarak , her iki dilde de aynı yorumu yapıyoruz ve başlıklarımızı çok dilli yapıyoruz (ancak başlıklara gerçekten çapraz dil yapmak için genellikle biraz daha fazla şey yapmamız gerekiyor; yani, extern "C"
derliyorsak C ++).
void
, o zaman "en sinir bozucu ayrıştırma" sorunu önlenmiş olabilir.
void foo()
bir işlevi bildiren tek sözdizimiydi. İmzalar sunulduğunda, C komitesi no parametresini eski sözdiziminden ayırmak zorunda kaldı ve void foo(void)
sözdizimini tanıttı . C ++ uyumluluk uğruna aldı.
void foo()
bunun yerine kullanmanın void foo(void)
fonksiyonel bir fark yaratacağı bir örnek verebilir misiniz ? Yani ben yıllardır geçersiz bir sürüm kullanıyorum ve herhangi bir sorun görmedim, bir şey eksik mi?
void foo() { if ( rand() ) foo(5); }
derler ve çalışır (çok şanslı değilseniz tanımsız davranışlara neden olur), oysa void foo(void)
aynı gövdeye sahip bir derleme hatasına neden olur.
Sorunuzun C ++ ile ilgili olduğunu anlıyorum, ancak C söz konusu olduğunda cevap K&R, sayfa 72-73'te bulunabilir:
Ayrıca, bir işlev bildirimi aşağıdaki gibi bağımsız değişkenler içermiyorsa
double atof();
bu da atof'un argümanları hakkında hiçbir şey varsayılmayacağı anlamına gelir; tüm parametre kontrolleri kapalıdır. Boş argüman listesinin bu özel anlamı, eski C programlarının yeni derleyicilerle derlenmesine izin vermeyi amaçlamaktadır. Ancak yeni programlarla kullanmak kötü bir fikirdir. İşlev bağımsız değişkenler alıyorsa, bildiriniz; argüman almazsa, void kullanın.
C ++ 11 N3337 standart taslak
Fark yok.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Ek C "Uyumluluk" C.1.7 Madde 8: Beyanlar şöyle demektedir:
8.3.5 Değişiklik: C ++ 'da, boş parametre listesiyle bildirilen bir işlev bağımsız değişken almaz. C'de boş bir parametre listesi, işlev bağımsız değişkenlerinin sayısı ve türünün bilinmediği anlamına gelir.
Misal:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
Gerekçe: Bu, hatalı işlev çağrılarından (yani yanlış sayıda veya türde bağımsız değişkenli işlev çağrılarından) kaçınmak içindir.
Orijinal özellik üzerindeki etki: İyi tanımlanmış özelliğin anlambilimine geçin. Bu özellik C'de “eskimiş” olarak işaretlendi.
8.5.3 fonksiyonları :
4. Parametre-bildirim-deyimi, işlev çağrıldığında belirtilebilen bağımsız değişkenleri ve bunların işlenmesini belirler. [...] Parametre-bildirim-deyimi boşsa, işlev bağımsız değişken almaz. Parametre listesi (void) boş parametre listesine eşdeğerdir.
C99
C ++ 11 tarafından int f()
belirtildiği gibi, argümanlar hakkında hiçbir şey belirtmez ve eskimiştir.
Çalışma koduna veya UB'ye yol açabilir.
C99 standardını şu adreste ayrıntılı olarak yorumladım: https://stackoverflow.com/a/36292431/895245
C'de, boş bir işlev başvurusunda bir boşluk kullanırsınız, böylece derleyicinin bir prototipi olur ve bu prototipin "bağımsız değişken" olmaz. C ++ 'da, derleyiciye bir prototipiniz olduğunu söylemek zorunda değilsiniz çünkü prototipi dışarıda bırakamazsınız.