Neden gcc bağımsız bir işlev bağımsız değişken ile tanımlanmıştır geçirilecek izin veriyor mu?
Neden bu kod derleme yapar?
#include <stdio.h>
void foo() {
printf("Hello\n");
}
int main() {
const char *str = "bar";
foo(str);
return 0;
}
gcc bile çok fazla argüman foo taşıyorum bir uyarı atmaz(). Bu beklenen bir davranış mı?
CEVAP
C fonksiyonu boş parametre listesi ile bildirilen her zamanki aritmetik promosyonlar tabi çağrıldığını zaman argümanların rastgele bir sayı kabul eder. Bağımsız tedarik işlevinin tanımı için uygun olduğundan emin olmak için arayan sorumluluğundadır.
Bir fonksiyonu sıfır argüman alacak bildirmek için, void foo(void);
yazmak gerekir.
Bu tarihi nedenlerden dolayı; aslında, C fonksiyonlarının prototipleri, C B, türsüz bir dil evrimleşmiş olarak yoktu. Prototip eklendiğinde, orijinal typeless tanımlamalar geriye uyumluluk için dil kalmıştı.
Boş parametre listesi hakkında uyarmak için gcc almak, -Wstrict-prototypes
kullanın:
Eğer bir fonksiyon veya değişken türlerini belirtmeden ilan tanımlanır uyar. (Eski tip fonksiyon tanımı ise bağımsız değişken türleri belirten bir bildiri öncesinde bir uyarı olmadan izin verilir.)
İşlev bağımsız değişken listesi için J...
İşlev olarak şablon bağımsız değişken ...
Bağımsız değişken bir işlev listesinde...
JavaScript bir işlev için bağımsız değ...
Neden tek bir bağımsız değişken (dönüş...