Modern C Dili ve Programcılık Kuralları

2011 de C programlama dili c++ ile birlikte güncellendi. Tam olarak neyin değiştiğini bulamamıştım. c güncelemesi c++ dilini de etkiliyor.
    1) Artık bir statik tanımlı diziyi bir sayıyla doldurmak için döngü kullanmanıza gerek yok. Eskisi;
uint32_t numbers[64];
    memset(numbers, 0, sizeof(numbers)); //içinde döngü var zaten.
Yenisi;
    uint32_t numbers[64] = {0};
 
2) Kütüphaneyi sürekli import etmesini önlemek için c99 da böyle bir yöntem kullanılıyordu. eskisi;
#ifndef PROJECT_HEADERNAME
#define PROJECT_HEADERNAME
.
.
.
#endif /* PROJECT_HEADERNAME */
yenisi;(dosyanın başına eklemeniz yeterli)
#pragma once
 
3) Bir struct oluşturulmuşsa undefined behaviordan kaçınmak için başlangıç değeri vermek gerekli. eskisi;
    struct thing {
        uint64_t index;
        uint32_t counter;
    };

    struct thing localThing;

    void initThing(void) {
        memset(&localThing, 0, sizeof(localThing));
    }
yenisi;
    struct thing {
        uint64_t index;
        uint32_t counter;
    };
yada ...
    struct thing localThing = {.counter = 3};
yada
    localThing = localThingNull;

    struct thing localThing = {0};
daha yenisi;(visual c++ da denedim)
    struct thing {
        uint64_t index=0;
        uint32_t counter=0;
    };
daha da yenisi= java ve c#(c++/clr) ile uğraşıyorsanız. derleyici otomatik başlangıç değeri atıyor.
 
4) Kendi kendine genişleyen dizi tanımı hep merak konusu olmuştur. Hoş olmasına rağmen böyle bir veri yapısı kontrolsüz büyürse yazılımda güvenlik açığı oluşturur ve programın hata vermesine neden olur. Hele dinamik bir elemanı temizlemeyi unutur, döngüde kullanır ve geri dönüp temizlemeye çalışırsanız bir daha ulaşamazsınız. c++ raii çözümü bulsa da sadece c dilinde yoktu.
Sırf böyle bir yapıyı kendisi yazamadıkları için c programlamaya bir daha yaklaşmıyorlar. eskisi;
uintmax_t arrayLength = strtoumax(argv[1], NULL, 10);
    void *array[];

    array = malloc(sizeof(*array) * arrayLength);

    /* remember to free(array) when you're done using it */
yenisi;
 uintmax_t arrayLength = strtoumax(argv[1], NULL, 10);
    void *array[arrayLength];

    /* no need to free array */
not: Matlab ve python dillerinde bile sürekli genişleyen diziler tavsiye edilmez.

5) C dilinde bir fonksiyon parametre türü sabit olması sürekli fonksiyon yazmamız gerektiği manasına gelmez. c++ dilininde bir fonksiyon iskeleti oluşturulur ve sonradan istenen tip belirlenir.
C++ son versiyonuyla birlikte ufak bir hamleyle tip belirtmenize bile gerek kalmıyor.
C dilinde bunu yapamazsınız ama "void*" hiçbir türeden olmadığından hiyerarşide istediğiniz tipe dönüştürebilirsiniz. parametreleriniz void* olsun, sonradan dönüşmesini istediğiniz tipe atayın.

6) Her zaman bir dönüş tipi olsun ki hata kontrolü yapabilelim. yeni güncellemede dönüş tipi void olan çok az standart fonksiyon kaldı.

7) CamelCase kullanın. Javacılar buna çok dikkat ederler. Hele bir grup ile yazılım yazıyorsanız aforoz edilirsiniz. Stackoverflow da çok tartıştım. Eğer bu ilkeye dikkat etmiyorsanız soru sormanıza da izin vermiyor bu site Kimse size yardım etmek istemez. Çünkü kodunuz başkası tarafından okunamıyordur. Python diline dikkat edin adeta okunabilirlik üzerine kurulmuş.

8) Kodunuz okunamıyorsa ve sayfalarca kod yazdıysanız elle düzeltme imkanınız yoktur. Nasıl temel imla ve yazım hatalarını düzeltmek için Word varsa clang-format da c/c++ kodunu düzeltmek için var.
not: buradaki komutlar bash komut satırı için geçerlidir. windows üzerinde birçok bash çözümü vardır.

- Dosyalardaki kodları düzenleyen komut (llvm sitiliyle düzenliyor.);
clang-format -style="{BasedOnStyle: llvm, IndentWidth: 4, AllowShortFunctionsOnASingleLine: None, KeepEmptyLinesAtTheStartOfBlocks: false}" "$@"
- Dosya uzantılarını otomatik düzenliyor.
cleanup-format -i *.{c,h,cc,cpp,hpp,cxx}
- Eğer projeniz dosyaların içinde ağaç gibi gidiyorsa ve dosya uzantılarını otomatik düzenlemek istiyorsanız (burada parallel işleme için 12 işlem parçacığı kullanılıyor.);
find . \( -name \*.c -or -name \*.cpp -or -name \*.cc -or -name \*.h \) |xargs -n12 -P4 cleanup-format -i

9) C ve C++ dilleri rakip değillerdir. C++ C eklentisi olarak çıkmıştır. Aynı platform üzerinde kaymak kaydıyla şu ana kadar C++ içinde Çalışmayan C kodu görmedim. Bu yüzden artık C/C++ diye ifade etmenin yanlış olmayacağını düşünüyorum.
Python3 bile Python2 ile uyumlu değilken burada böyle bir uyum olması, Hız açısından Sadece iki rakibi(assembly,fortran) olması ve uğraşanların fazla olması bu ikiliyi bulunmaz hint kumaşı yapmaktadır.

Referans: https://matt.sh/howto-c

Yorumlar

Popüler Yayınlar