C KODLAMA STANDARDLARI



1. KAYNAK PROGRAM KUTUKLERI


1000 satirdan buyuk kaynak programlarin hem derlemesi yavas, hem de bakimi zordur. Programlari 1000 satirlik kutuklere bolun.
79 karakterden buyuk satirlar her terminalde ve editorde kolay goruntulenmez. Bu nedenle cok uzun satirlar kullanmayiniz.



1. KUTUK ADI TANIMLAMA KURALLARI.


Her kaynak program ana kutuk adi ve ekten olusur. Ekler genelde derleyici ve kullanilan programa gore duzenlenir ( .c, .cc, .l, .y gibi). Ana kutuk adi sekiz karakterden olusmalidir.
OKUBENI (README) directory altindaki kutukleri ve derleme adiminda kullanilan parametreleri icermelidir.
make derleme islemi icin makefile yerine "Makefile" kullanin.



2. PROGRAM KUTUKLERI.


1. Her programin basinda kutuk icinde ne oldugunu belirten on bilgi (prologue) olmalidir. Dizi icindeki islevler, tanimlar burada kisaca anlatilir. Gerekirse yazar adi ve yazildigi tarih belirtilir.
2. Baslik (header) eklemeleri bu aciklamanin pesine yazilir (include files). Bazi sistemlerde sistemin kullanigi eklemeler, kullanicininkilerin onunde yer almalidir.
3. "define" ve "typedef" komutlari bundan sonra yazilir. Once degismez "macro" tanimlari daha sonra islevsel tanimlar, en son "typedef" ve "enum" tanimlari yapilir.
4. Tanimlardan sonra tum programda kullanilan "global/external" bilgi alanlari tanimlanir. Genel siramada once "extern", static olamayan global tanimlar, ve sonra static tanimlar yer alir. Bir yapi tanimini ilgilendiren "define" varsa, bu yapi taniminin pesinde yer almalidir.
5. Program icinde kullanilan islevler bu tanimlamalarin sonunda yer alir. Belirli bir kural olarak, incelenmesi en kolay olan yonteme gore siralanmalidir. Ayni duzeyde cagirilan islevlerin beraber bulunmasi yararlidir.
Genel program yapisi :
/*
* on aciklama (on bilgi)
*
linclude
linclude

ldefine DEGISMEZLER

ldefine FUNC(x)

typedef struct A &l123;
...
} a_t;

enum &l123; NO=0, YES};

extern int *p_external;
extern struct A_EXT a_ext;

int *p_global;
struct A_GLOBAL &l123;
...
} a_glob;
ldefine A_GLOBSZ sizeof(struct A_GLOBAL);

static int *p_static;

main(int argc, char **argv)
&l123;
...
}



3. HEADER KUTUKLERI


Baslik (header) tanimlari her alt sistem icin ayri kutuklerde olmalidir. Makina bagimli tanimlar olasi tasimalarda degistirilmek uzere ayri kutuklerde tanimlanmalidir. Tanimlarda ve eklemelerde (include) kullanilmali "kutukadi" gibi tanimlardan kacinilmalidir. C derleyicileri -I parametresi ile kutugu nereden alacagini bulabilmektedir. Bu ozellik baslik (header) kutuklerinin yerinin degismesi durumunda programlarda degisiklik yapilmasini gerektirmez.
Islevleri ve "external" tanimlari iceren baslik (header) kutukleri tanimin yapildigi kaynak programa eklenmelidir. Boylece derleyici tip denetimini kolaylikla yapabilir. baslik (header) kutukleri ic ice (nested) tanimlanmamalidir. Her baslik (header) kutugundeki on bilgi alaninada bu baslik (header) kutugunden once hangilerinin eklenmesi gerektigi anlatilmalidir.



4. DIGER KUTUKLER.


OKUBENI (README) adli bir kutugun hem genel goruntuyu tanimlamasi, hem de program derleme ve kullanim biciminin aciklanmasi acisindan onemi cok buyuktur. Burada kosullu derleme adimlari ve makina bagimli kutukler veya programlar aciklanir.



2. ACIKLAMALAR HAKKINDA.


Aciklamalar ne oldugunu, nasil yapildigini ve parametrelerin neler oldugunu bildirmelidir. Kisa aciklamalar ise islemin ne oldugunu anlatmalidir. Her islevin basinda 3-10 satirlik bir aciklama her satirda islemin yapilisini ayrintilayan aciklamadan daha iyidir. Blok aciklama
/*
*
...
*
biciminde yazilmalidir. Veri yapilari, algoritmalar blok aciklama icinde anlatilmalidir.



3. TANIMLAR HAKKINDA.


Global tanimlar hemen birinci kolondan baslamalidir. Tum "external" tanimlarin onunde "extern" bulunmalidir. Eger bir "extern" dizi tanimi (array) varsa bu tanimin boyu her tanimda belirtilmelidir. Gosterge taniminda kullanilan &l8217;*&l8217; turun onunde degil, tanimin onunde yer almalidir :
char *s, *p;
gibi.
Iliskili olmayan tanimlar ayni turden olsalar da ayri satirlarda tanimlanmalidir.
Tanimlarda kullanilan degiskenler, degerler ve aciklamalar alt alta gelecek sekilde "tab" tusu ile ayrilmalidir.
Eger "define" komutundaki degerin program icinde bir anlami yoksa "enum" kullanmak daha iyidir. Ornegin :
ldefine KETCH (1)
ldefine YAWL
ldefine SLOOP (3)
ldefine SQRIG (4)
ldefine MOTOR (5)
yerine :
enum bt &l123; KETCH=1, YAWL, SLOOP, SQRIG, MOTOR };
Bir degiskenin ilk degeri onemli ise ilk degeri acikca yazilmali, C derleyicisinin degeri belirlemesi beklenmemelidir. "long" olarak tanimlanan degismezlerde "l" yerine "L" kullanilmalidir. Cunku "2l" ile "21" kolaylikla karisir.
"static" tanimlar mutlaka belirtilmelidir. Hatta STATIC diye bir "define" kullanilmasi daha dogru olur.
Islevlerin geri dondurdugu degerin tipi belirtilmelidir. En cok yapilan hata matemetiksel islevlerin "double" dondurdugunun unutulmasidir.



4. ISLEV TANIMLARI HAKKINDA


Her islevinden once aciklama alani (prologue) bulunmalidir. Burada islevin ne yaptigi anlatilmalidir.
Islevin dondurdugu deger mutlaka belirtilmelidir. Eger bir deger dondurmuyorsa "void" tanimlanmalidir.
Islevin her parametresi tanimlanmalidir. Islev icinde kullanilan dongu degiskeni icin &l8217;i&l8217;, karakter gostergeleri (pointer) icin &l8217;s&l8217; ve karakter tanimlamalar icin &l8217;c&l8217; kullanimi tum islevlerde ayni amac icin kullanilmalidir. Ayni gruptan olan islevlerde de ayni tur degiskenleri ve parametreleri kullanmak, onlari cagiran programlarda kodlama kolayligi getirir.
Degisken sayida parametresi olan islevlerde C dilinde tanimlanmis "varargs" kullanmak anlasilmasi veya tasinmasi acisindan onemlidir.
Eger islev icinde kullanilan bir degisken kaynak programda tanimli "global" degiskenlerden degil de baska kaynak programda yer aliyorsa "extern" kullanilarak tanimlanmalidir.
Icerlek yazma ve bosluklar islevin blok yapisini gosterir. Her ic blok icin en az uc bosluk birakarak yazmak programi daha okunakli yapar.
Uzun kosullarda her ve/veya isleminden sonra kalani baska bir satira yazmak, "for" dongulerinde her bir dongu islemini ayri satira yazmak ve "?" isleminde her bir kosulu ayri satira yazmak programi daha okunakli yapar.



5. BASIT KOMUTLAR (SIMPLE STATEMENTS) HAKKINDA.


Her satirda mumkunse bir islem, komut olsun. "while" dongulerinde dongu govdesi bos ise ";" ayri bir satirda olsun. "if" deyiminde test sonucunda sifir olmama kosulu derleyicinin kabulune birakilmasin. Ornegin :
if (f() != FAIL)
her zaman
if (f())
biciminden daha iyidir. Eger FAIL degeri sifir ise ve sonra birisi bu degeri -1 yapmak isterse tum kodlamada ilgili satirlarin bulunup duzeltilmesi gerekebilir. Bu sekilde kullanim degeri degismese bile diger "if" deyimlerinde de yer almalidir.
Sifir olamayan derleyici kabulu ancak asagidaki testler icin kullanilmalidir.
- Sonuc yalniz sifir ve baska bir sey olmuyorsa,
- Sonuc daha onceden adlandirilmis (TRUE gibi) ve baska birsey olmuyorsa, ornegin "isvalid", "valid" veya "checkvalid" gibi islevlerde
kullanilabilir.
Kodlama kolayligi olsa bile birden cok atama ("=" islemi) kullanilmamalidir.
"Yasak Kelime o" deyimi hic kullanilmamalidir. Eger bir donguden cikmak icin gerekiyorsa, dongu icindeki bolum islev haline getirilmeli, bu islevin dondurdugu deger TRUE/FALSE olarak tanimlanmali ve "Yasak Kelime o" deyimi yerine donen deger kullanilmalidir.
Ancak "Yasak Kelime o" deyimi kullanmak gerekiyorsa, etiket (label) programin okunmasina kolaylik saglamasi acisindan, kodlamanin daha solundan yazilmalidir.



6. BIRLESIK KOMUTLAR (COMPOUND STATEMENTS) HAKKINDA.


Kivrimli prantez (brace) icindeki komutlarin tumune birlesik komutlar denir. Birlesik komutlarda :
kontrol &l123;
komut;
komut;
}
stili kullanilir. Buna "K & R stili" denir.
"switch" deyimde bir "case" seceneginden sonra "break" komutu yoksa buraya aciklama icinde bilgi yazin. Eger son secenek varsayilan (default) degilse mutlaka "break" kullanin ve her zaman son secenek varsayilan (default) olsun.
"if-else" deyiminde her kosul icin komutlar (bir tane de olsa) mutlaka "brace" icine alinsin. Ozellikle ic ice tanimlanmis "if" deyimlerinde "else" olmamasi durumunda bu kodlama cikabilecek sorun veya hatayi azaltir.
"do-while" dongulerinde mutlaka "brace" kullanilmalidir.



7. ISLEMLER HAKKINDA.


Tum ikili islemler ile degiskenler arasinda en az bir bosluk birakin (&l8217;.&l8217; ve &l8217;->&l8217; haric). Eger bir deyimin okunmasi zor ise en az oncelikli islemden deyimi satirlara bolmek gerekir. Gerekli oldugunda parantez kullanarak islem onceliklerini gosterin. Ancak cok fazla parantez kullanmayin. Insan gozu parantezleri okumaya alisik degildir.
virgul (comma) islemi en cok "for" dongulerinde birden cok degiskene ilk deger vermek icin yararlidir. Bunun disinda fazla kullanmamaya calisin.
"?:" islemindeki &l8217;?&l8217; oncesindeki kosulu parantez icinde yazin.
C dili deyimlerinden "sizeof" disinda kalanlardan sonra ilk parantezden once bir bosluk birakilmalidir. Islevlerin parameterlerindeki virgulden sonra da bir bosluk birakilmalidir. "macro" tanimlarinda ilk parantezden once bosluk birakilmamalidir. Yoksa on derleyici (preprocessor) parametreleri algilayamaz.



8. DEGISKENLERI ADLANDIRMA.


Degiskenin adinin basinda ve sonunda &l8217;_&l8217; kullanmayin. Bu tur degiskenler kullaniciya acik olmayan derleyici degiskenleri arasinda bulunabilir.
Tum "define" ve "enum" komutlarinda degismezler icin buyuk harfli tanim kullanin.
Islev adlari, degisken adlari, "typedef", "struct", "union" ve "enum" tanimlari icin kucuk harf kullanin.
"macro" islevleri buyuk harf olmalidir. Kucuk harf "macro" tanimlari eger "macro" bir islev gibi calisiyorsa kabul edilebilir.
Ayni programda yalniz buyuk ve kucuk harf farki olan degiskenler ve cok benzer degiskenler kullanmayin (foo ve Foo gibi veya foobar ve foo_bar gibi).
Baska anlama gelebilecek degisken adlari kullanmayin. Mumkunse &l8217;l&l8217; harfini hic kullanmayin. Her zaman &l8217;1&l8217; ile karisabilir.
"typedef" tanimlarinin sonunda cogu kez "_t" eki bulunur.



9. DEGISMEZLER HAKKINDA


Sayisal degismezler icin "define" kullanmak ileride programin bakimini kolaylastirir. Yalniz "define" tanimini degistirmek yeterli olabilir.
Degismezler kullanim amaclarina uyumlu tanimlanmalidir. Ornegin "long" degismez &l8217;L&l8217; ile kayan noktali degismez &l8217;.0&l8217; ile.
ASCII gosterilemeyen degismezleri "define" altinda tanimlayin veya sekizli (octal) tanimini tirnak icinde kullanin.
NULL yerine &l8217;0&l8217; kullanmayin.



10. "MACRO" HAKKINDA


Karmasik deyimler "macro" olarak tanimlanir. Eger "macro" parametreleri etrafinda parantezler yoksa islem onceliklerinde sorunlar olabilir.
Bazen hem "macro" hem de islevler ayni adla tanimlanabilir. Bu durumda parametrelerin isleyisi onem kazanir. Islevlerde kullanilan parametrelerin degerleri isleve gecerken, "macro" larda parametrenin acilimi kullanilir.



11. KOSULLU DERLEME


Kosullu derleme islemi makina bagimli islemler, "debug" ve derleme sirasinda belirlenen seceneklerin kullanimi icin onemlidir.
Mumkun ise "ifdef" tanimini baslik (header) kutugune koyun. Kaynak program icine koymamaga calisin.



12. DUZELTME (DEBUG)


"enum" kullanirken mumkunse ilk deger sifirdan farkli olmali. Eger sistemde hata kosulu sifir ise her zaman birinci deger hatayi gosterir.
Her zaman hatayi gormek icin eklemesindeki bilgiyi kullanin. Yeri geldiginde "assert" olanagindan yararlanin.
Test amacli kodlamalarda her zaman baslik (header) icinde "define" ile "macro" kullanin. Boylece kodlamada degisiklik yapmaniz gerekmez.



13. "make" KOMUTU HAKKINDA


"make" komutu icin kullanilan bazi genel kavramlar asagida verilmistir :

all Her zaman tum kutuphaneleri derler.
clean ara kutuklerin tumunu siler.
debug testler icin kullanilan &l8217;a.out&l8217; uretir.
depend install programlari ve kutuphaneleri gercek yerine tasir.
deinstall "install" islemini geri alma adimidir.
mkcat yardim ekranlarini "man" komutu ile kullanilir hale getirir.
lint "lint" programini calistirir.
print/list tum kaynak programlarin listesini almaya yarar.
rdist kaynak programlari baska bilgisayarlara tasimaya yarar.
Bunlara ek olarak "Makefile" icin komut satirindan "DEBUG" veya "CFLAGS" tipi degerler girilebilir.



14. PROJEYE BAGIMLI STANDARDLAR


Genelde bu bolumde proje bagimli kutuk adlari, directory adlari, baslik bilgisi adlari gibi tanimlar yazilir.





//Derleme + Alıntıdır

__________________