İlk olarak, #define kullanarak sabitin türünü tanımlamanın mümkün olmadığını anladım, bu neden?
Neden ne? Bu doğru değil:
#define MY_INT_CONSTANT ((int) 12345)
İkincisi, birini diğerine göre kullanmanın herhangi bir avantajı var mı?
Evet. #define
derleme başlamadan önce bile değiştirilen bir makro tanımlar. const
yalnızca bir değişkeni değiştirir, böylece değiştirmeye çalışırsanız derleyici bir hatayı işaretler. A kullanabileceğiniz #define
ancak a kullanamayacağınız bağlamlar vardır const
(en son clang'ı kullanarak bir tane bulmakta zorlansam da). Teorik olarak, a const
çalıştırılabilir dosyada yer kaplar ve belleğe bir referans gerektirir, ancak pratikte bu önemsizdir ve derleyici tarafından optimize edilebilir.
const
s çok daha derleyici ve hata ayıklayıcı dostudur #define
. Çoğu durumda, hangisini kullanacağınıza karar verirken göz önünde bulundurmanız gereken en önemli nokta budur.
Sadece kullanabileceğiniz #define
ama kullanamayacağınız bir bağlam düşündüm const
. Çok sayıda .c
dosyada kullanmak istediğiniz bir sabitiniz #define
varsa, bir başlığa yapıştırmanız yeterlidir. A ile bir const
C dosyasında bir tanıma sahip olmanız gerekir ve
const int MY_INT_CONST = 12345;
extern const int MY_INT_CONST;
bir başlıkta. MY_INT_CONST
içinde tanımlandığı dosya dışındaki herhangi bir C dosyasında statik veya genel kapsam dizisi boyutu olarak kullanılamaz.
Bununla birlikte, tamsayı sabitleri için bir enum
. Aslında Apple'ın neredeyse değişmez yaptığı şey budur. Bu, hem #define
s hem de s'nin tüm avantajlarına sahiptir, const
ancak yalnızca tamsayı sabitleri için çalışır.
enum
{
MY_INT_CONST = 12345,
};
Son olarak, hangi yol daha verimli ve / veya daha güvenlidir?
#define
Teoride daha etkilidir, ancak söylediğim gibi, modern derleyiciler muhtemelen çok az fark olmasını sağlar. #define
atamaya çalışmak her zaman bir derleyici hatası olduğundan daha güvenlidir
#define FOO 5
FOO = 6;
const
derleyici uyarılar verebilse de, s atanması için kandırılabilir:
const int FOO = 5;
(int) FOO = 6;
Platforma bağlı olarak, sabit salt okunur bir bölüme yerleştirilirse ve C standardına göre resmi olarak tanımlanmamış davranışsa, atama çalışma zamanında yine başarısız olabilir.
Şahsen, tamsayı sabitleri enum
için, diğer türlerdeki sabitler için her zaman s kullanırım , const
yapmamak için çok iyi bir nedenim yoksa kullanırım.