Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Include 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: greet fonksiyon bildirimini içeren başlık dosyanız. Bu sefer, tüm içeriği GREET_H sembolünü kullanarak include guard'lar ile sarmalayın.
  • main.c: Başlık dosyasını dahil eden, greet fonksiyonunu uygulayan ve onu main() 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

#endif

Bir 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;
}
quiz iconKendini test et

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