Bağlayıcı düzeyinde programlama dili kavramı kalmamıştır çünkü .o dosyaları ve kütüphaneler zaten makine koduna derlenmiştir.
a.o dosyası "foo işlevinin tanımı bende var" diyebilir ve b.o dosyası da "ben foo'yu çağırıyorum" diyebilir. a.o ve b.o farklı dillerde yazıldıklarında iki konuda farklılık olabilir:
-
Sembollerin .o dosyasındaki durumları: Örneğin, C kaynak dosyasında foo diye geçen bir isim C'de _foo olarak derlenmiştir.
-
Parametrelerin işlevlere geçirilme yöntemleri. (Bakınız stdcall ve arkadaşları.)
Dolayısıyla, extern(C) veya extern(C++) dendiğinde D derleyicisine bu sembolleri nasıl oluşturacağı ve parametreleri nasıl geçireceği bildirilmiş oluyor. Yani, D derleyicisinin C++ dilini bilmesi gerekmiyor.
int falanca_D(int, double) {
return 0;
}
extern(C)
int falanca_C(int, double) {
return 0;
}
extern(C++)
int falanca_Cpp(int, double) {
return 0;
}
void main() {
}
Yukarıdaki programı 'deneme' adıyla oluşturduğumuzu düşünürsek, içinde bizi ilgilendiren işlev isimleri şöyle görünüyor (Unix ortamlarındaki nm programı ile bakarak):
'
$ nm deneme | grep falanca
0000000000425cf8 W _D6deneme9falanca_DFidZi
0000000000425d00 W falanca_C
0000000000425d08 W _Z11falanca_Cppid
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]