#Define mı const mı?

Başlatan pax, 31 Mayıs 2015, 20:55:27

pax

Değişken tanımlarken sabit bir değeri #Define veya  const olarak tanımlama farkı nedir? Veya en doğrusu hangisidir?

MrDarK

Değişkene atanan değerlerin const olmasından yanayım.

#define bilgisi ile derleyiciye nereyi derlemesi gerektiğini söyleyebiliyoruz bu sayede yazılımın belli başlı yerlerini kesmek mümkün olabiliyor.

Detaylı araştırırsak daha güzel yorumlar bulacağımıza eminim.

#define 'ın bir ön işlemci kodu olduğunu biliyorum, const neye giriyor acaba ?   
Picproje Eğitim Gönüllüleri ~ MrDarK

Tagli

Aslında const kullanmak daha iyi sabitler için. Ancak ayrıntıları hatırlamamakla birlikte C ve C++'ın const ifadesine yaklaşımı farklı diye biliyorum. C++ const kullanılan bazı yerlerde C derleyicileri hata veriyor. Sorunla nerede karşılaştığımı hatırlamıyorum ama ya enumaration ya da switch case yapısı ile ilgili bir şeydi. Galiba C'de mesela #define BIR 1 diye (saçma da olsa) bir tanım yaptık. Bunu case BIR: diye kullanabiliyoruz. Ama const int BIR = 1; diye tanımlamışsak kullanamıyoruz. Ancak C++'ta bu yapılabiliyor.
Gökçe Tağlıoğlu

Icarus

O tip sabitlerin tanımlanması için bunların dışında 3-4 teknik daha var.
Önemli nokta sabitin neyi etkilediği ?

erenbasturk

pax

const hafıza üzerinde optimizasyon yapılmasını sağlayan bir komuttur. const'u bir degişken tipinden önce kullandığınız zaman derleyiciye bunu rw-data'ya değil ro-data'ya yazın diyorsunuz. Sabit değerler için const kullanmak avantaj sağlar. debug yapabilme, tip güvenilirliği sağlamaktadır.

C'de switch case yapısında. Case kısmına sadece tam sayılar yazılabilir. Ondalıklı sayılar yada degişkenler yazılamaz. Ne kadar const'da kullanılsa bu sadece derleyicinin hafıza tutulduğu yeri değiştirmektir. Sonuç olarak case kısmına C'de degişken yazılamaz.

Alıntı yapılan: Tagli - 31 Mayıs 2015, 21:06:58
Aslında const kullanmak daha iyi sabitler için. Ancak ayrıntıları hatırlamamakla birlikte C ve C++'ın const ifadesine yaklaşımı farklı diye biliyorum. C++ const kullanılan bazı yerlerde C derleyicileri hata veriyor. Sorunla nerede karşılaştığımı hatırlamıyorum ama ya enumaration ya da switch case yapısı ile ilgili bir şeydi. Galiba C'de mesela #define BIR 1 diye (saçma da olsa) bir tanım yaptık. Bunu case BIR: diye kullanabiliyoruz. Ama const int BIR = 1; diye tanımlamışsak kullanamıyoruz. Ancak C++'ta bu yapılabiliyor.

z

#5
const ile değerlere anlamlı kelimeler iliştirmiş oluyoruz.

define da yanlış hatırlamıyorsam bunun ötesinde komut bile atayabiliyoruz.

Örneğin programın pek çok yerinde send(10,12,45); satırı geçecekse

define yolla send(10,12,45) tanımı yapıp

yazıp ardından komut aralarında yolla; diyebiliyoruz.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

İkisinin de kullanım alanları farkı.
Mesela sabit bi array var ve program içinde bu arrayin farklı indexlerdeki elemanlarına erişmek istiyosun. Bu durumda const kullanırsın böyle birşeyi define ile yapamazsın yani  define bu kadar esneklik sağlamaz. Ama atıyorum pi sayısını bi çok yerde kullanmak istiyosun pi sayısını define ile tanımlayıp her seferinde 3.1415... yazmaktan kurtulursun.
Siz sorunuz hangi durum için sordunuz?Örnek verirseniz daha açıklayı cevaplar verilebilir.

pax

Alıntı yapılan: yamak - 01 Haziran 2015, 08:18:24
İkisinin de kullanım alanları farkı.
Mesela sabit bi array var ve program içinde bu arrayin farklı indexlerdeki elemanlarına erişmek istiyosun. Bu durumda const kullanırsın böyle birşeyi define ile yapamazsın yani  define bu kadar esneklik sağlamaz. Ama atıyorum pi sayısını bi çok yerde kullanmak istiyosun pi sayısını define ile tanımlayıp her seferinde 3.1415... yazmaktan kurtulursun.
Siz sorunuz hangi durum için sordunuz?Örnek verirseniz daha açıklayı cevaplar verilebilir.

sizin de örnek verdiğiniz gibi örneğimiz pi sayısı olsun

#define pi 3.14

const float pi=3.14

benim anlamaya çalıştığm tam olarak verdiğim örenklerden hangisi en doğrudur.

yamak

#8
Bu durumda #define kullanmanız daha mantıklı. Çünkü değişken olarak tanımlarsanız bi daha derleyici onu optimize etmekle uğraşacak.Ama bu durumda bile yine kullancağınız yere göre değişir.Mesela pi sayısı bi fonksiyona referans olarak geçirmek istiyosunuz;o zaman const ile tanımlamak mantıklı olur. Ya da mesela pi değil de başka bi örnek verirsek

size diye bişey tanımlamak isiyosunuz ve bununlar tanımladığınız array lerin size ı belirleme istiyosunuz örneğin aşağıdaki gibi

unsigned char UartBuffer[size];

bu durumda mecburen define kullanmak gerekir.
Yani dediğim gibi duruma göre değişir.

pax

Alıntı yapılan: yamak - 01 Haziran 2015, 09:34:44
Bu durumda #define kullanmanız daha mantıklı. Çünkü değişken olarak tanımlarsanız bi daha derleyici onu optimize etmekle uğraşacak.

anladım. peki define kullanınca hafızada daha az yer kaplar gibi bir durum var mı?

yamak

Yani sadece matematiksel işlemlerde pi yerine koyma için kullanılacaksa const ile tanımlarsanız flash ta değişken türüne göre yer ayrılır. Ama define'da böyle bişey olmaz.
Hocam bu sorular ucu açık sorular net olarak şöyle şöyle olur söylenemez.Dediğim gibi kullanım durumuna göre değişir.

Farukc

Const #define dan daha iyidir. Yada #define const tan daha iyidir demek yanlış bir yaklaşım. Her ikisininde kullanım alanları farklı.

Mesela const ile makro tanımlayamazsınız.

pax

Alıntı yapılan: Farukc - 01 Haziran 2015, 09:55:43
Const #define dan daha iyidir. Yada #define const tan daha iyidir demek yanlış bir yaklaşım. Her ikisininde kullanım alanları farklı.

Mesela const ile makro tanımlayamazsınız.

konu bu değil zaten.

konu

#define pi 3.14

const float pi=3.14

bu tanımlamalardan hangisinin en doğru olduğu.

Farukc

Bende diyorumki ikiside doğru yazdığın programa göre ikisinide kullanabilirsin. Hangisinin daha doğru olduğunu yazdığın programın özellikleri belirler. Vaktim olursa bir örnek atarım.

pax

Alıntı yapılan: Farukc - 01 Haziran 2015, 10:08:38
Bende diyorumki ikiside doğru yazdığın programa göre ikisinide kullanabilirsin. Hangisinin daha doğru olduğunu yazdığın programın özellikleri belirler. Vaktim olursa bir örnek atarım.
anladım. ben de bunu merak ediyorum.