include dosyalar - Temel bilgi

frekans50

⁵⁰
Katılım
8 Ekim 2022
Mesajlar
1,251
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

Kod:
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

Kod:
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
Kod:
// 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;
}
Kod:
#include "fonksiyonlar.c"

int say();


Kod:
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.

Kod:
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.

Kod:
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.


Kod:
#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.

Kod:
#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
7,986
Mesajlar
131,717
Üyeler
3,188
Son üye
EmrahKaplan

Son kaynaklar

Son profil mesajları

erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Back
Top