Fonksiyon Prototiplerinin ve Bildirimlerinin Görünürlüğü

    C++ 'da fonksiyon kullanılmadan önce bildirilmeli ya da tanımlanmalıdır. Ana kodumuzun üzerinde tüm fonksiyonlarımızı yazarak sayfa içerisinde kalabalığa sebep oluruz, bunu engellemek için fonksiyon bildirimlerinin (function prototypes) kullanıldığından bahsetmiştik. Bunlar da yeterince fazlalaşınca da header dosyalarına geçiş yapıyoruz. 
    Eğer ki fonksiyonun çağırılması bu bildirim ya da tanımlamadan önce yapılırsa compile time hatası dediğimiz hata tipiyle karşılaşırız:

Severity Code Description Project File Line Suppression State

Error (active) E0304 no instance of overloaded function "topla" matches the argument list Project1 E:\!Blog\C++ Dersleri\Project1\merhabadunya.cpp 14

#include <iostream>
 
//int topla(int a,int b = 17);
//int topla(int, int, int);
 
int main() 
{
	int toplam = topla(5);
	// int toplam = 22;
}
 
int topla(int a, int b) // fonksiyon parametrelerine ulaşmak için isim veriyoruz
{
	int sonuc = a + b; // sonuc adıyla int tipinde bir değişken tanımlayıp
					   // a + b ye eşitliyoruz.
	return sonuc;	   // geri dönüş değerimizi belirliyoruz.
}
 
int topla(int a, int b, int c)
{
	return a + b + c;
}
 
 
yukarıdaki kod için topla fonksiyonlarının her ikisi de yazılmasına rağmen bu hataya sebebiyet vermiştir. Bildirim satırlarının "comment-out" yapıldığına dikkat edin. Bu hatayı engellemenin yolu en azından fonksiyon bildiriminin fonksiyon çağrısından önce yapılmasıdır. Yorum satırı haline getirilmiş iki bildirim satırı yorum satırı durumundan çıkıp kod haline getirildiğinde hata da giderilmiş olacaktır. Mutlaka bildirim yapmak zorunda da değiliz, şu da geçerli bir durumdur ancak dediğim gibi yukarı kısımda "kod kalabalığına" sebebiyet verir :

int topla(int a, int b) // fonksiyon parametrelerine ulaşmak için isim veriyoruz
{
	int sonuc = a + b; // sonuc adıyla int tipinde bir değişken tanımlayıp
					   // a + b ye eşitliyoruz.
	return sonuc;	   // geri dönüş değerimizi belirliyoruz.
}
int main() 
{
	int toplam = topla(5, 17);
	// int toplam = 22;
}
fonksiyonun çağırılmadan önce tanımlandığına dikkat edin.
    Prototip yazılırken fonksiyonun geri dönüş tipi int ve aldığı parametrelerin tipi (int,int) (adını yazma zorunluluğu yoktur) yazılmak zorundadır.
    Header dosyası kullanımı içinse yapılması gereken yeni bir header file oluşturup tüm fonksiyon bildirimlerini içine yazmak ve ana kodumuz içerisinde #include "oluştuğumuz header dosyasının adı.h" yazarak ana kodumuza dahil edilmesini istememizdir.

örnek olarak matematik.h dosyamızı oluşturalım ve içine fonksiyon bildirimlerimizi yazalım:

int topla(int a,int b = 17);
int topla(int, int, int);
ana dosyamız şu şekle gelebilir :

#include <iostream>
#include "matematik.h"
 
int main() 
{
	int toplam = topla(5, 17);
	// int toplam = 22;
}
int topla(int a, int b) // fonksiyon parametrelerine ulaşmak için isim veriyoruz
{
	int sonuc = a + b; // sonuc adıyla int tipinde bir değişken tanımlayıp
					   // a + b ye eşitliyoruz.
	return sonuc;	   // geri dönüş değerimizi belirliyoruz.
}
int topla(int a, int b, int c)
{
	return a + b + c;
}

bu durumda ilk derlemede matematik.o dosyası oluşturulup main.o içerisinde kullanılıyor olarak ilişkilendirilmiş olacaktır. Eğer ki fonksiyon bildirimlerini yazıp fonksiyonun içeriğini herhangi bir yerde yazmamışsak bu bize : unresolved external symbol hatası olarak döner. Bu, bana bir fonksiyon yazacağını söyledin ben herşeyi derlememe rağmen bu fonksiyona ulaşamadım demektir.



Hiç yorum yok:

Yorum Gönder

Türksat Saat Kanalı ve IRIG-B Time Code

Türksat Saat Kanalından Saat Bilgisi Nasıl Alınır? Uyduda kanalları dolaşırken, şu Türksat Saat kanalı hep dikkatimi çekmiştir. Özellikle  S...