include dosyalar - Temel bilgi

Katılım
8 Ekim 2022
Mesajlar
965
Temel bilgim az olduğu halde anlamaya çalışıyorum

Acaba header file include edilmişse ayrıca aynı isimde c dosyasını include etmek gerekmiyor diyebilir miyiz? Derleyici bu işi kendisi mi yapıyor? Path içerisinde aynı isimde c dosya varsa onu mu kullanıyor? Denemek kolaydır biliyorum fakat genelleme açısından emin olmak istedim

include:
include "fonksiyonlar.h"
 
Son düzenleme:
Eger bu fonksiyon ile program calisiyor ise, yani program derlendiginde sorun yok ise. o fonksiyonun dosyasini bulup fonksiyonu eklemis demektir abi. yani sorun yok.
 
derleme tamam. Fakat sadece fonksiyon iskeleti kullanılmış olabilir. İşlevi yoktur? Header içindeki haliyle düşünürsek.
 
derleme tamam. Fakat sadece fonksiyon iskeleti kullanılmış olabilir. İşlevi yoktur?
Anladigim dogruysa sen bunu nasil test edecegim diyorsun. fonksiyonlar.h nin icine kullanabilecegin bir sey yaz. Onuda fonksiyonu cagirdigin yerde kullan. Eger derleme sonrasi hata almaz isen fonksiyonlar.h yi kullanabilmissin demektir.
 
include dosyasında fonksiyonun sadece deklarasyonu bulunur, içeriği bulunmaz. İnclude ederek fonksiyon hangi parametreleri alır, ne döndürür bilirsin. Fonksiyonun tanımının bulunduğu C dosyası ile ilgili hiçbir kolaylık veya otomatik işlem sağlamaz.
 
Derlerken dahi hata verebilir bence, ben bu dosyayi bulamadim diye. Ornegin derlemeden once oraya olmayan bir dosya yaz

ornek:
include "stttt.h" /*kesin yoktur*/

SOnra derleme yap hata verirse bakarsin
 
Abi bence bu asagidakine ciddi bir sekilde goz atmaniz iyi olur.

 
Evet otomatik bulma ve kullanma diye bir şey yok.
Header içine ayrıca c dosya include edilecekmiş. Fonksiyon işlevini içeren farklı isimde dosya da include edilebilir. c dosya ana programa da include edilebilir. Yeter ki fonksiyonun tanımını içersin
main.cpp:
// Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "fonksiyonlar.h"



int _tmain(int argc, _TCHAR* argv[])
{
    say();
    return 0;
}
fonksiyonlar.h:
#include "fonksiyonlar.c"

int say();


fonksiyonlar.c:
int say(){
 
    printf("deneme");
    return 0;
}
 
Son düzenleme:
C dosyasını da include içerisine konması lazım diye de birşey yok. Derleyicinin C dosyalarını ayrı ayrı derlemesini ya senin temin etmen lazım, yada IDE nin bunu yapıyor olması lazım.

Derleme süreci genel olarak şöyle işliyor: Projede belli sayıda C dosyası var. Her C dosyanın da include dosyası olabilir veya olmayabilir. Derleyici C dosyalarını ayrı ayrı derler ve object dosyalarını üretir. Sonra da linker bu object dosyalarını birleştirerek çalıştırılabilir programı üretir. İnclude dosyalarının görevi, sadece ilgili C dosyasının derlenebilmesi için gerekli.

Mesela sinüs hesaplayan bir fonksiyon yazdın ve sine.c dosyasına koydun.

C:
double sine(double angle)
{
    double rc;

    /* sinus hesaplama isleri yapiliyor ve sonuc rc degiskenine yaziliyor */

    return rc;
}

Sonra da fonksiyon deklarasyonunu sine.h dosyasına koydun.

C:
double sine(double angle);

Sonra da ana program olan main.c de bir açının sinüsünü hesaplaman gerekti. Bunun için sine.h include edersin ve sonra da fonksiyon doğru bir şekilde çağırırsın.


C:
#include "sine.h"

int main(void)
{
    double a = sine(3.141592654 / 2);
   
    return 0;
}

Sonra da derleyici ile sine.c ve main.c ayrı ayrı derlenir ve object dosyaları üretilir, sonra da linker bu object dosyalarını birleştirip programı oluşturur.
 
Fakat hocam bu senaryoda sine.c dosyayı hiç bashetmedik. ne header dosyada ne de ana dosyada include "sine.c" diye bir şey geçmedi. İşte asıl bunu merak ediyordum. derleyici mi onu buluyor? Yaptığım denemede bulmadı. belki derleyici veya IDE ile ilgilidir
hem
#include "sine.h"
hem de
#include "sine.c"

satırları programın içine sırasıyla eklenmeli.

Ana dosya veya include dosya içinde olabilir diye anladım
 
main.c nin derlenebilmesi için sine.c yi include etmen gerekmiyor. Sadece sine.h include edilmesi yeterli. Bu include dosyasından derleyici, ilgili fonksiyon kaç tane argüman alıyor, ne döndürüyor belirlemiş oluyor. Ama linker ile object'leri birleştirirken bütün c programlarının listelenmesi lazım, yoksa linker hata verir ve çalıştırılabilir program üretilemez.
 
Şunu da belirteyim burada:

Yukarıdaki örnekte şunu yapsan da gene çalıştırılabilir program elde ederdin. Main dosyasına sine.c dosyasını include edersin, sine.h dosyasını da hiç hazırlamazsın. sonra da sadace main.c dosyasını derlersin oradan da doğrudan çalıştırılabilir program elde edersin. Mesela Arduino IDE si böyle yapıyor. Senin yazdığın bütün ino'ları bir C dosyasının içine tıkıyor ve o tek dosyayı derliyor.

C:
#include "sine.c"

int main(void)
{
    double a = sine(3.141592654 / 2);

    return 0;
}

Ama sadece çok basit programlarda böyle birşeyi yapman makul kabul edilebilir. Onlarca kalabalık dosyadan oluşan bir projede her C dosyasını böyle tek bir dosyaya tıkarsan, programı sadece tek bir C dosyasıyla yazmaktan farkı kalmaz. Modülleri birbirinden izole etmemiş olursun, bir işlevin yanlışlıkla başka işlevi etkileme ve bozma riskini almış olursun ve daha birçok ilave potansiyel sorun olur.
 
Ama sadece çok basit programlarda böyle birşeyi yapman makul kabul edilebilir. Onlarca kalabalık dosyadan oluşan bir projede her C dosyasını böyle tek bir dosyaya tıkarsan, programı sadece tek bir C dosyasıyla yazmaktan farkı kalmaz. Modülleri birbirinden izole etmemiş olursun, bir işlevin yanlışlıkla başka işlevi etkileme ve bozma riskini almış olursun ve daha birçok ilave potansiyel sorun olur.


Ben bunu anlamadım. Mesela ben fonksiyonları .h dosyasına yazıp .cpp dosyası hazırlamıyorum. .h dosyasında sadece protoipleri yazıp .cpp de içeriği yazmanın avantajı nedir?. Sonuçta .h dosyasıda .cpp dosyasını çağırmıyor mu?
 
Basit projelerde bir avantajı yok. Ama belli bir proje ölçeğinden sonra artık bütün fonksiyonları, herşeyi tek bir C/C++ dosyasına koyarak işi halledemiyorsun.
 
Derleyici C dosyalarını ayrı ayrı derler ve object dosyalarını üretir. Sonra da linker bu object dosyalarını birleştirerek çalıştırılabilir programı üretir.
C dosyamızda 50 tane fonksiyon olsun. Ana programda sadece 3 tanesini kullanıyoruz. Sadece bu 3 fonksiyon mu ana programa eklenir? Yoksa tüm fonksiyonlar mı?

Bu işlem seçime bağlıysa dikkat etmek gereken derleyici ayarı/ifadesi nedir?
 
Gerçek bir iş yapan bir C programda birçok C kaynak dosyası olur. Her dosyanın sadece belli bir iş ile ilgili olması lazın ve sadece dışarıdan kullanılması gereken fonksiyonları ve değişkenleri bir header ile dışarı deklare etmesi lazım. Yani tamamen kaynak kodunda sen belirliyorsun hangi fonksiyon veya değişkenin dışarı görünür olduğunu. Ne kadar az fonksiyon ve değişken görünür ise o kadar iyi.
 
chatTA, .h dosyasına .c içindeki bütün fonksiyonların deklarasyonları eklemeden çağırırsak ne olur, .c içindeki fonksiyonları kısmen mi dahil etmiş oluruz?
Birde imla hatalarım varsa onları düzelt. :katil1:
 
Eğer bir fonksiyonu, prototipi olmadan kullanmaya kalkarsan, normalde derleyici UYARI mesajı üretir, ama kodu gene derler. İstersen HATA mesajı üretmesini de sağlayabilirsin. Ama eğer fonksiyona doğru parametreleri verirsen gene fonksiyon çalışır, sorun çıkmaz.

Neticede prototip olmasının sebebi, derleyicinin kontrol etmesini sağlamak. Yoksa biraz assembly yazmak gibi oluyor, herşey serbest, programın çakılması da serbest :D
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,985
Mesajlar
119,321
Üyeler
2,835
Son üye
alpermete

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top