hiçbir teknik fark yoktur. Derleyici, .c
dosyasını eklemenize veya isterseniz .h
dosyasını doğrudan derlemenize izin verir.
Bununla birlikte, büyük bir kültürel farkı:
Beyannameler (prototip) .h
dosyalarına yazılır. .h
dosya, ilgili .c
dosyasında uygulanan ne olursa olsun arabirimi arabirimidir.
Tanımlar.c
dosyalarına yazılır..h
dosyasında belirtilen arabirimi uygularlar.
fark .h
dosya (ve genellikle olacaktır) çoklu derleme birimlerine (.c
dosyaları) içine #include
d olabilir olmasıdır., .h
dosyasındaki bir işlevi tanımladığınızda, birden çok .o
dosyasında sona erer ve bağlayıcı, çok tanımlı bir simge hakkında şikayette bulunur. Bu nedenle, tanımların .h
dosyalarında olmaması gerekir. Bir işlev bir .c
dosyada tanımlanırsa
(Inline fonksiyonları. istisnadır) ve diğer .c
dosyalarından kullanmak istiyorum, bu işlevin bir deklarasyon bu diğer .c
dosyaların her biri mevcut olması gerekir. Bu yüzden bildirimi, her birinde .h
ve #include
'da bulabilirsiniz. Her bir .c
dosyasındaki bildirimi de yineleyebilirsiniz, ancak bu çok sayıda kod çoğaltmasına ve sürdürülemez bir karışıklığa yol açar. Bir işlev bir .c
dosyasında tanımlanır ama sen diğer .c
dosyalarından bunu kullanmak istiyorsunuz Eğer
, başlığında beyan etmek gerek yoktur. Esasen bu .c
dosyasının bir uygulama detayıdır. Bu durumda, static
işlevini de yapın, böylece diğer dosyalarda aynı adlı işlevlerle çakışma olmaz.
Ne yazık ki, standart hiçbir şey için yetki vermese de, kullandığım çoğu derleyici dosya uzantısına bir dereceye kadar bağımlıdır. Bunu deneyin: "header.c" ve "header.h" olarak adlandırılan ('int main() {return 0;} ') içeren iki dosya oluşturun ve bunları gcc ile derlemeye çalışın.(VS'ye yakın bir yere bile gitmiyorum!) – dirkgently
Programcıların çoğunun .h dosyasındaki statik işlevlerin bildirimlerini koymadığından şüpheleniyorum. .h ve .c arasındaki temel fark, arayüz ve uygulama arasındadır. – Dipstick
@dirkgently: Tamam, ancak derleyiciniz doğru dosya uzantısını almazsa bir C derleyicisi olarak davranmıyor. Standart, C derleyicileri olmayan programlar hakkında bir şey söylemez :) – Thomas