Kütüphaneleri Daha Profesyonel Yazabilmek

cemalb

Üye
Katılım
9 Eki 2019
Mesajlar
126
Puanları
1
Herkese Kolay Gelsin

Mikrodenetleyici promgramlarken kütüphane dosyalarını daha iyi yazabilmek için önceden yazılmış profesyonel
kütüphaneleri inceliyorum. Elimde AVR için uart kütüphanesi var. Orda gördüğüm ve aklıma takılan bir iki nokta var.
Net bir cevap bulamadım.

Mesela;
1-Versiyon sorgulamasını neden yapıyoruz?

#if (__GNUC__ * 100 + __GNUC_MINOR__) < 405
#error "This library requires AVR-GCC 4.5 or later, update to newer AVR-GCC compiler !"
#endif
gibi.


2- Bazı sabitleri değişken gibi değilde, #define ile tanımlamanın ne gibi bir artısı var? Daha doğru olanı mı bu?
Neden?
#ifndef UART_TX_BUFFER_SIZE
#define UART_TX_BUFFER_SIZE 32
#endif
gibi.


3-Bu kütüphanede .c de ki bir fonksiyonu .h 'ta "extern" etmiş. Örneğin .c deki "void uart_init(unsigned int baudrate){}"
fonksiyonunu .h 'ta "extern void uart_init(unsigned int baudrate);" şeklinde neden extern etmiş ki?
Sadece "void uart_init(unsigned int baudrate);" şeklinde yapsak aynı şey değilmi?
 
1-Versiyon sorgulamasını neden yapıyoruz?

#if (__GNUC__ * 100 + __GNUC_MINOR__) < 405
#error "This library requires AVR-GCC 4.5 or later, update to newer AVR-GCC compiler !"
#endif
gibi.
Yeni versiyonda eklenen bir özelliği kullanıyor olabilir,
mesela 4.4 ile 4.5 arasında ne fark var bakıp buradan anlaşılabilir.
Programı yazıp derlerken o versiyonu kullanmıştır,
derlemede sıkıntı çıkmasın diye versiyonu şart koşup önlem almış olur.

2- Bazı sabitleri değişken gibi değilde, #define ile tanımlamanın ne gibi bir artısı var? Daha doğru olanı mı bu?
Neden?
#ifndef UART_TX_BUFFER_SIZE
#define UART_TX_BUFFER_SIZE 32
#endif
gibi.
Bunlar değişken değil, sabit sayılar,
programda bunları sayı olarak yazmak yerine
bakınca kolay anlamak, programında anlaşılırlığını arttırmak ve
yazarken sayıları akılda tutmak yerine daha kolay hatırlanan
bir yazı karşılığı vererek program yazmayıda kolaylaştırmak için yapılıyor.

3-Bu kütüphanede .c de ki bir fonksiyonu .h 'ta "extern" etmiş. Örneğin .c deki "void uart_init(unsigned int baudrate){}"
fonksiyonunu .h 'ta "extern void uart_init(unsigned int baudrate);" şeklinde neden extern etmiş ki?
Sadece "void uart_init(unsigned int baudrate);" şeklinde yapsak aynı şey değilmi?

Bu başında void (int8, in16 vs. de olabilirdi) ve sonunda noktalı virgül olan yazım
fonksiyon değil, fonksiyon prototipi,
C de yazım kuralı olarak önce fonksiyonu yazar tanımlarsın sonra
o fonksiyonu kullanabilirsin,
derleyici önce fonksiyon tanımını görür, ha fonksiyon buymuş der,
sonra derlediği satırlarda fonksiyonun kullanıldığı yerlere denk geldikçe
derleme esnasında bir mantıksal problem yaşanmamış olur.

Ama programın başına bir sürü fonksiyon yazıp
sonra programın asıl iş yapan main vs. kısımlarına gelirsen
bu okunaklı bir kod olamıyor bunu aşabilmek için
fonksiyon prototipleri kavramı var,
derleyiciye önce ahan bak böyle bir fonksiyon kullanacağım ben
hemde daha tanımlamadan kullanacağım ama
fonksiyonun kendisi kodun sonlarında bir yerde tanımlı, su yapma.

Fonksiyon prototipi için extern kullanmanın bir anlamı olduğunu sanmıyorum,
hele .h dosyasında tanımlanan fonksiyon prototipi için
extern kullanmak pek gerekebilecek bir şey gibi gelmiyor.
Belki bilgisayar programcılığından kalma bir alışkanlıktır bilemiyorum.
.h dosyasında fonksiyon çalıştırma yani kullanmak uygun bir şey değil
bu nedenle tanımlanmış bir fonksiyonu .h dosyasında kullanmayacağımız için
extern ile dahil etmek pek mantıklı gelmedi bana.

Belki: Örneğin; a.h a.c ve b.h b.c dosyalarımız var,
foo fonksiyonu b.c de tanımlı ve prototipide b.h da tanımlı olsun,
foo fonksiyonunu a.c de kullanabilmek için
a.h dosyasında foo prototipini extern ile göstermek gerekebilir,
bu durumu denersem tekrar yazarım.
 
Son düzenleme:
Cevabınız için çok teşekkürler. Açıklayıcı oldu. Sadece son soruda sormak istediğimi tekrar edeyim;
prototip olayını biliyorum zaten. Ama başına extern koymanın anlamı ne? Ben kütüphane yazarken header file'de prototiplerin başına extern yazmıyorum ve sorunsuz çalışıyor. Burda ayrıca bir anlamı mı var acaba diye merak ettim.
 

Forum istatistikleri

Konular
128,130
Mesajlar
915,283
Kullanıcılar
449,846
Son üye
g-silver

Yeni konular

Geri
Üst