C dilinde fonksiyon prototipleri, bir fonksiyonun dönüş tipi, adı ve parametre tipleri hakkında derleyiciye bilgi veren fonksiyon bildirimleridir. Prototipler genellikle başlık dosyalarında (.h) yer alır. Kullanımlarının avantajları şunlardır:
Prototip örneği:
// math_utils.h int sum(int a, int b); // Fonksiyon prototipi
// main.c #include "math_utils.h" int main() { int result = sum(3, 4); // derleyici sum'un imzasını biliyor }
Prototipsiz bir fonksiyon, int döndürdüğü ve belirsiz sayıda argüman aldığı varsayılarak algılanır ki bu, çalışma zamanı hatalarına yol açabilir.
Soru: C dilinde bir fonksiyonu, tanımlanmadan önce, eğer prototipi ilan edilmemişse çağırmak mümkün mü?
Cevap: C89 standardında, dönen değer int olduğunda ve parametreler kontrol edilmediğinde (implicit int, implicit promotion) fonksiyonlar tanımlanmadan önce çağrılabiliyordu. Modern standartlarda bu, uyarılara veya hatalara neden olur ve böyle bir yaklaşım kullanılmamalıdır.
Hata örneği:
int main() { foo(1, 2); // foo'nun prototipi yok } int foo(double x, double y) { ... }
Derleyici, parametreleri int olarak varsayarak fonksiyonu çağıracak, ancak imza double varsayıyor — sonuç: UB veya yanlış değerler.
Hikaye
Büyük bir bilim projesinde veri işleme fonksiyonları için prototipler eksikti.
floatyerineintaktarımı yapıldığında, hatalar yalnızca hatalı hesaplamalar sırasında ortaya çıktı, oysa derleme hatasız geçti.
Hikaye
Modüler bir yapılandırma otomasyon aracında, fonksiyonlar sadece
.cdosyalarında tanımlanmıştı, başlık dosyalarında ilan edilmemişti. İki modülde aynı isimli ve uyumsuz parametreli fonksiyonlar tanımlandı — bu, bağlanma aşamasında zor yakalanan bir hataya yol açtı.
Hikaye
Gömülü sistemler için bir projede bir sorun çıktı: Başlatma fonksiyonu, prototipi olmadan tanımlanmadan önce çağrılıyordu. Derleyicinin parametrelerin ve dönüş değeri tipleri hakkında varsayımlarına dayanarak, mantık ciddi şekilde bozuldu ve sistem, hafıza düzenlemesinin farklı olduğu belirli sürümlerde hata verdi.