Yıllar sonra bu soruyu keşfediyorum. Her yanıtı ve yorumu okuduktan sonra, birkaç ayrıntıya açıklık getirebileceğimi düşündüm ... Bu, Google aramasıyla buraya gelen insanlar için yararlı olabilir.
Soru özellikle "extern" fonksiyonlarını kullanmakla ilgilidir, bu yüzden global değişkenlerle "extern" kullanımını görmezden geleceğim.
3 işlev prototipi tanımlayalım:
//--------------------------------------
//Filename: "my_project.H"
extern int function_1(void);
static int function_2(void);
int function_3(void);
Başlık dosyası, ana kaynak kodu tarafından aşağıdaki gibi kullanılabilir:
//--------------------------------------
//Filename: "my_project.C"
#include "my_project.H"
void main(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 1234;
Derlemek ve bağlantı kurmak için, o işlevi çağırdığımız kaynak kod dosyasında "function_2" tanımlamalıyız. Diğer iki işlev, " .C" farklı kaynak kodunda tanımlanabilir veya kaynak koduna sahip olmayabileceğimiz herhangi bir ikili dosyada ( .OBJ, * .LIB, * .DLL) bulunabilir.
Farkı daha iyi anlamak için tekrar "my_project.H" başlığını farklı bir "* .C" dosyasına ekleyelim. Aynı projede, aşağıdaki dosyayı ekliyoruz:
//--------------------------------------
//Filename: "my_big_project_splitted.C"
#include "my_project.H"
void old_main_test(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 5678;
int function_1(void) return 12;
int function_3(void) return 34;
Dikkat edilmesi gereken önemli özellikler:
Bir işlev bir başlık dosyasında "statik" olarak tanımlandığında, derleyici / bağlayıcı o dosyayı içeren her modülde bu ada sahip bir işlevin örneğini bulmalıdır.
C kütüphanesinin bir parçası olan bir işlev, yalnızca o modülde "statik" olan bir prototip yeniden tanımlanarak yalnızca bir modülde değiştirilebilir. Örneğin, bellek sızıntısı algılama özelliği eklemek için "malloc" ve "free" çağrılarını değiştirin.
"Extern" belirleyicisi işlevler için gerçekten gerekli değildir. "Statik" bulunmadığında, her zaman bir fonksiyonun "extern" olduğu varsayılır.
Ancak "extern" değişkenler için varsayılan değer değildir. Normalde, değişkenlerin birçok modülde görünür olmasını tanımlayan herhangi bir başlık dosyasının "extern" kullanması gerekir. Tek istisna, bir başlık dosyasının tek bir modülden dahil edilmesinin garanti edilmesi olabilir.
Birçok proje yöneticisi daha sonra bu değişkenin herhangi bir başlık dosyasının içine değil modülün başına yerleştirilmesini isteyecektir. Video oyunu emülatörü "Mame" gibi bazı büyük projeler, bu değişkenin bunları kullanan ilk fonksiyonun üzerinde görünmesini bile gerektirir.