Include Guard'lar
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 2 / 61.
Bir başlık dosyası bir projede birden fazla kez dahil edildiğinde, derleyici aynı bildirimleri tekrar tekrar görür ve bu da hatalara yol açar. Bu durum genellikle birden fazla dosya aynı başlık dosyasını dahil ettiğinde veya başlık dosyaları birbirini dahil ettiğinde ortaya çıkar. Include guard'lar bu sorunu çözer.
Bir include guard, bir başlık dosyasının içeriğinin yalnızca bir kez işlenmesini sağlamak için üç önişlemci yönergesi kullanır:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
İşte şu şekilde çalışır: #ifndef MATH_UTILS_H, MATH_UTILS_H sembolünün henüz tanımlanmamış olup olmadığını kontrol eder. Eğer tanımlanmamışsa, önişlemci devam eder ve onu hemen #define MATH_UTILS_H ile tanımlar. Bu nokta ile #endif arasındaki her şey derlemeye dahil edilir.
Bu başlık dosyası ikinci kez dahil edildiğinde, MATH_UTILS_H zaten tanımlanmış durumdadır, bu nedenle tüm blok atlanır. Koruma adı genellikle, noktaların ve özel karakterlerin yerine alt çizgilerin kullanıldığı, büyük harflerle yazılmış dosya adıdır.
Oluşturduğunuz her başlık dosyası include guard içermelidir. Bu, derleme hatalarını önleyen ve kodunuzun projenizin herhangi bir yerinden güvenle dahil edilmesini sağlayan standart bir uygulamadır.
Görev
KolayInclude guard'lar ekleyerek bir başlık dosyasını çift dahil edilmeye (double inclusion) karşı koruyalım. Önceki dersteki selamlama yardımcı programı üzerine inşa edeceksiniz, ancak bu sefer başlık dosyasının birden fazla kez dahil edilmesinin güvenli olduğundan emin olacaksınız.
İki dosya oluşturacaksınız:
greet.h:greetfonksiyon bildirimini içeren başlık dosyanız. Bu sefer, tüm içeriğiGREET_Hsembolünü kullanarak include guard'lar ile sarmalayın.main.c: Başlık dosyasını dahil eden,greetfonksiyonunu uygulayan ve onumain()içinden çağıran ana dosyanız.
greet fonksiyonu, isim için bir const char* parametresi almalı ve şunu yazdırmalıdır:
Hello, Alice!Başlık dosyanız şu yapıyı takip etmelidir:
#ifndef GREET_H
#define GREET_H
// function declaration here
#endifBir girdi alacaksınız: bir isim (string).
Selamlama mesajını, Alice kısmını sağlanan isimle değiştirerek tam olarak yukarıdaki formatta yazdırın.
Kopya kağıdı
Include guard'lar, başlık dosyalarının derleme sırasında birden fazla kez işlenmesini önleyerek hataların oluşmasını engeller.
Bir include guard üç önişlemci yönergesi kullanır:
#ifndef HEADER_NAME_H
#define HEADER_NAME_H
// başlık içeriği buraya
#endif
#ifndef, bir sembolün tanımlanıp tanımlanmadığını kontrol eder. Eğer tanımlanmamışsa, #define onu tanımlar ve içerik işlenir. Sonraki eklemelerde sembol zaten tanımlanmış olduğu için tüm blok atlanır.
Guard ismi genellikle, noktaların ve özel karakterlerin yerine alt çizgi konularak büyük harflerle yazılmış dosya adıdır.
Standart bir uygulama olarak her başlık dosyası include guard'lara sahip olmalıdır.
Kendin dene
#include <stdio.h>
#include "greet.h"
// YAPILACAK: "Hello, <name>!" yazdıran greet fonksiyonunu uygula
int main() {
char name[100];
scanf("%s", name);
// YAPILACAK: name değişkeni ile greet fonksiyonunu çağır
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi