İ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. #definederleme başlamadan önce bile değiştirilen bir makro tanımlar. constyalnızca bir değişkeni değiştirir, böylece değiştirmeye çalışırsanız derleyici bir hatayı işaretler. A kullanabileceğiniz #defineancak 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.
consts ç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 #defineama kullanamayacağınız bir bağlam düşündüm const. Çok sayıda .cdosyada kullanmak istediğiniz bir sabitiniz #definevarsa, bir başlığa yapıştırmanız yeterlidir. A ile bir constC 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_CONSTiç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 #defines hem de s'nin tüm avantajlarına sahiptir, constancak yalnızca tamsayı sabitleri için çalışır.
enum
{
MY_INT_CONST = 12345,
};
Son olarak, hangi yol daha verimli ve / veya daha güvenlidir?
#defineTeoride daha etkilidir, ancak söylediğim gibi, modern derleyiciler muhtemelen çok az fark olmasını sağlar. #defineatamaya çalışmak her zaman bir derleyici hatası olduğundan daha güvenlidir
#define FOO 5
FOO = 6;
constderleyici 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 enumiçin, diğer türlerdeki sabitler için her zaman s kullanırım , constyapmamak için çok iyi bir nedenim yoksa kullanırım.