Visual Studio'da C kodlarını C veya C++ derleyicisi ile derleme

09:47

Visual Studio IDE'sinde otomatik olarak uzantısı .c ise c derleyicisi ile .cpp ise C++ derleyicisi ile derleyebilmektedir. Fakat bu durumu aşağıdaki gibi bir ayarla değiştirmek mümkündür. Yani C kodlarını da C++ derleyicisi ile derlemek mümkün.




Neden böyle bir ayara ihtiyaç vardır?

C++ ile gelen Clean C denilen bir kavram vardır. Geleneksel C ile gelen bazı kuralları kullanmazsak bu C'nin %1'lik bir kısmıdır  C++ derleyicilerinde de derlenebilecek C kodları oluşturulabilir. Bu durumda hem daha güvenli hem de daha taşınılabilir kodlar oluşturmak mümkündür. Bu amaçla bu derleme ayarları değiştirirerek çalışmak istenebilir.




C'de ASCII - UTF-8 - UNICODE Kavramları



  • ASCII  :Standart ascii ’de türkçe karakter bulunmamaktadir. Çıkış amacı amerikan sisteminin ihtiyaçlarını karşılayacak şekildedir. C'de standart olarak karakterlerin ascii karşılıkları sistemde tutulmaktadır. Mesela A harfi sistemde 65 olarak tutulmaktadır. 7 bit' lik bir sistemdir.


image
  • UTF-8  :(Unicode Transformation Format 8-bit ) ASCII’ye bir bit koyularak 128 olan karakter sayisi 256 olmustur. Geriye çikan 128 karaketr için farkli bölgeler için farkli tablolar kullanılmaya baslanmistir. 8 bit' lik bir sistemdir.

  • UNICODE : Tüm karakterlerini içerir. universal code’un kisaltmasi. 8 bitlik characterler yerine 16 biti kullanir. Bazı özel amaçlı karakterlere control karakterleri denir. Görüntüsü olan control karakterlerine punchiation character denir.

C'de ASCII Kavramı:

C ‘de bir karakteri char olarak belirtebileceğiniz gibi doğrudan sayı formatında hex veya octal olarak da belirtebilirsiniz. Aşağıda \x’ ile başlayanlar hex olarak kabul edilmiş belirtilmeyenler octal olarak ifade edilmiştir.

image


Not: Büyük harflerden küçük harflere geçisi kolaylastirmak için 32 karakter uzaklik olusturulmus ki büyük harf A’nin 5. biti degistirilince küçük harf a olsun istenmistir.



Unicode karşılıkları için

C'de Türkçe Karakter Problemi

10:21




Visual Studio ‘da C/C++ kod geliştirme yapılırken türkçe karakterle ilgili dikkat edilmesi gereken 3 nokta bulunmaktadır.
1.     Sistem lokal ayarı
2.     Konsol Aktif Kod Page türü
3.     Kaydedilen kaynak kodun kaydedilme türü




İşletim sisteminin Region and Language kısmından sistem locale ayarları türkçeye çevrilmelidir. 






Konsolun ayarları artık değişmiş olması gerekir.







Yazılan kodların içinde karakter uyumu için dosyanın Encoding ayarlarının değiştirilmesi gerekebilmektedir. Burda uygun değişikliğin yapılması gerekebilir. Locale ayarları yapıldıktan sonra buna gerek olmayabilir.




Ardından kaynak kodun içinde setlocale ayarlarının yapılması gerekmektedir. Ardından kod çalıştırıldıktan sonra aşağıdaki gibi ekran çıktısı görülebilir.




Sabitler (CONSTANTS)

10:27

C’de sabitlerinde türleri vardir. C’de sabitler Tamsayı Sabitleri ve Gerçek Sayı sabitleri olarak ikiye ayrilir.
  • Tamsayi Sabitleri: Integer Constants
  • Gerçek Sayı Sabitleri: Floating Constants
Türkçede gerçek sayi ayiraci virgül(,) dür. C'de ve C++ ise nokta (.) gerçek sayi ayiraci olarak kullanılır.

C'de doğrudan değişkenlerinin türünü veren bir fonksiyon,operatör bulunmamaktadır. Bunu C++ typeid operatörü ile gerçekleştirebiliriz.
image
Yukarıda ki C++ kodunu çalıştırırsak aşağıda görüldüğü gibi sabitlerinde türlerinin olduğu ve tiplerini görebiliriz.
image

Yukarıda program çıktılarında görüleceği üzere 20 int 12.4 double olarak sabitlerin de türlerinin olduğu aşikardır.

  • Son olarak sabitlerle ilgili olarak; “Sabitler sayısal büyüklük ifade eden atomlardır.


C için Linux'te Komut Satirindan Kod Gelistirme Araçları

10:31


Kod geliştirme yapılırken linux ortamında komut satırından kullanabileceğimiz komutlar bulunmaktadır. Bunlardan çok kullandığım 5 tanesine bu yazımda değineceğim;

  1. apropos
  2. whatis
  3. man
  4. size
  5. objdump



apropos:


apropos komutu man sayfaların isimlerini ve tanımlarını tarayarak bize bu isimle benzer sonuçları çıkartır. Mesela apropos malloc komutu çalıştırılırsa aşağıdaki gibi bir çıktı elde ederiz.




malloc,mallopt vb.  gibi sonuçları çıkartığını görebilirsiniz. Burada c’de tam adını bilmediğimiz fonksiyon isimleri bu şekilde internette aramak yerine rahatca bulmamızı sağlar.


whatis:


man:

man mallocdediğimiz de ise malloc ile ilgili ihtiyacımız olan tüm bilgilere ulaşabileceğimiz manual sayfası açılacaktır.





size:


size komutuyla data | bss gibi memory alanlarının ne kadar yer kaplayacığına ilşkin verileri görebileceğimiz çıktılar üretir.




objdump:

Objdump ile ise çalıştırılabilir dosyalar üzerinde incelemeler yapabileceğimiz bir komut. Parametlerini, işlevselliğini yukarıda öğrendiğimiz man objdump ile öğrenebiliriz. objdump ile kısaca çalıştırılabilir dosyamızı disassemble edebiliriz.







    Makrolar

    04:52


    Makrolar derleyicilerden bağımsız ve derleyicilerden önce kod üzerinde değişiklik yapan preprecessor için yazılan kodlardır. preprecessor'ün kendi özel syntax'ı vardır. # ile başlayan ifadeler preprecessor için komut dizinleridir.

    MAKROLARIN SINIFLANDIRILMASI


    1. Object-like Macros'lar nesne gibi kullanılabilen makrolar oluşturulabilir.
    #define BOOL int tanımlamasını yaptıktan sonra BOOL ifadesi int gibi kullanılabilir.

    2. Function-like Macros'lar ise makroların fonksiyon gibi kullanılabildiği bildirimlerdir.

    #define kare(a)  ((a)*(a))

    3. Macro Arguments

    #define min(X, Y)  ((X) < (Y) ? (X) : (Y))

    4. Stringification kavramı daha çok yer değiştirme işlemi sırasında parametre olarak string ifadesi alıp bunu ikinci kısımda nasıl yerleştireceğine ilişkindir.

    #define PRINT(EXP) puts("-->" #EXP)  ifadesinde görüleceği üzere birinci kısımda fınksiyon içindeki ifadeyi ikinci kısımda string olarak birleştirip ekrana basmıştır.



    5. Concatenation kavramı makrolarla parametrelertek #'li ifadede gelen string(!) şeklinde olmaktadır. iki ##'li ifadede ise gelen parametre aynen gelmektedir.

    #define func(a) a##f("Hello World\n"); func(print) dediğimizde printf("Hello World\n"); biçimine gelecektir.





    6. Predefined Macros'lar ise default olarak tanımlı gelen makrolardır.Çok kulanılanlar aşağıdaki gibidir:

    __FILE__ :dosya ismini string gibi yer değiştirir.
    __LINE__ :yazılı olan yerin satır numarasıyla yer değiştirir.
    __DATE__ :preprecessorün devreye girdiği andaki zamanla yer değiştirir.
    __TIME__ :preprecessorün devreye girdiği andaki tarihle yer değiştirir.




    __cplusplus  :C++ derleyici ise define edilmiş olarak gelir.



    #define

    define makrosu kendisinden sonra gelen deyimi bir sonraki deyim ile değiştiren bir makro ifadesidir.



    #undef

    bu satırdan itibaren ilgili define ifadesi geçersiz olacaktır.



    #ifndef

    ifndef ifadesinden sonraki deyim define edilmemiş ise koşul içine girilir. Tanımlanmışsa koşul ifadesi içine girmez.



    #else

    koşul ifadesini sağlamıyorsa buraya girer.



    #endif


    şartlı makro ifadelerinin sonlanmasını sağlayan syntaz kural ifadesidir.




    #ifdef


    ifdef ifadesinden sonraki deyim define edilmiş ise koşul içine girilir. Tanımlanmamışsa koşul ifadesi içine girmez.


    C ile ilgili kısa notlar

    09:38



    • C ön işlemci syntax’ı, komut’ları, kuralları olduğundan dolayı unique bir programlama dilidir.
    • Ön işlemci çalıştırdığı komutları tamamladıktan sonra siler, dolayısıyla derleyici mesela # ile başlayan komutları görmeyecektir.
    • C standartları belirlenmeden önceki C’ye traditional C denir. C’nin ilk zamanlarında yayınlanan kitaplarda ilk örnek olarak verilen program:
    image
    • 1970’lerden itibaren kullanılmaya başlanan C programlama dili 1989’da C89 adıyla standarta kavuştu.
    • 1999 yılında C99 adıyla C ’de köklü değişiklikler oldu ama hala default olarak C89 versiyonuna göre kod geliştirilmektedir.
    • Fonksiyonların prototiplerinin yazılmasına declare function denir.
    • C’de main fonksiyonu olmazsa Compile Time ‘de hata vermez. Link Time’de hata verir.
    • Fonksiyonların kendisini çağırması da mümkündür. Buna recursive denir.
    • Değişken türleri default type ve user type olarak ikiye ayrılır. default type primitive veri türüdür. void veri türünü saymazsak 12 veri türü vardır. 9 tane tamsayı, 3 tane gerçek sayı türünü ifade edebilecek değişken türü vardır.
    • integer type ile int type birbirinden farkli kavramlar.integer type 9 farkli tamsayi türüne verilen genel isim.
    • C dilinde “;” sonlandirici olarak görev görür.Tıpkı cümle sonundaki . gibi.
    • C’de bütün anahtar sözcükler küçük karakterlidir.
    • C’ de Generic (genel) isimlendirmeden kaçinilmasi gerekmektedir. Isimlendirmeyi yeteri kadar özellestirmek önemlidir.
    • C’de kod alani özellikler açısından iki bölgeye ayrilir. Bunlar fonksiyonlarin dışında olan bölge ikincisi fonksiyonlarin oldugu bölgedir.
    • Bir degiskenin nerede kullanilacagina ilişkin kavram “scope” kavramidir.
    • Global degiskenler static ömürlüdür yani program sonlanana kadar yasar.
    • Compile Time’da kullandigimiz isimler Run Time’de bir adresten başka bir şey degildir.
    • C bir adres dilidir. Değiskenlerin adreslerinin kullanarakta değisiklik yapabiliriz.
    • C++ içindeki C ile Bağımsız C arasındaki faklılıklar bulunmaktadır.
    • Derleyici firmaları tasarım sırasında dile ek özellikler verebilirler. Ama bu durumda taşınabilirlik açısından sıkıntı yaşanabilir. Tasarım sırasında ek özellikler verilmesine extension denir.