28 EKİM 2009, ÇARŞAMBA
statik sabit vs #define
#define
daha basit static const
değişkenleri kullanmak daha mı iyi? Ya da belki de içeriğe bağlı?
Avantajları her yöntemin dezavantajları nelerdir?
CEVAP
1 EKİM 2010, Cuma
Her şey kullanıma bağlı olarak, artıları ve eksileri:
- çeteleler
- sadece tamsayı değerler için mümkün
- düzgün kapsamlı / tanımlayıcı clash konular güzel, özellikle
enum class X
numaralandırma kapsamındaX::
disambiguated nerede C 11 sınıfları Sırala ele - kesinlikle yazılmış, ama bir büyük kadar imzalanmış ya da imzalanmamış int boyut üzerinde hiçbir kontrolü C 03 (gerçi belirtebilirsiniz biraz alana hangi olmalılar dolu numaralama üyesi yapı/sınıf/Birliği), süre C 11 varsayılanları
int
ama olabilir açıkça set ile programcı - adresi alabilir mi - numaralandırma değerleri etkin satır içi kullanım noktalarına yerine gibi bir şey yok
- güçlü Kullanım kısıtlamaları (örneğin
template <typename T> void f(T t) { cout << t; }
artan örtülü yapıcı, döküm operatör ve kullanıcı tanımlı operatörler ile bir sınıf içine bir numaralama sarabilirsiniz ama derlemek olmaz) - her sabitin türü alınan kapsayan numaralama, yani
template <typename T> void f(T)
farklı örnekleme zaman geçti aynı sayısal değeri farklı çeteleler, ortaya farklı herhangi bir gerçekf(int)
örnekleme. Her işlevin nesne kodu olabilir özdeş (görmezden Adres uzaklıklar), ama ben yapmazdım herhalde derleyici/bağlayıcı ortadan kaldırmak için gereksiz kopyalar ama olabilir kontrol derleyici/bağlayıcı ilgilenirsen. - hatta sattığınız/decltype, olabilir mi bekliyorsun numeric_limits sağlamak yararlı içeriden bilgi kümesi anlamlı değerler ve kombinasyonları (gerçekten de, "yasal" kombinasyonu olmasa bile notated kaynak kodu göz önünde bulundurun
enum { A = 1, B = 2 }
-A|B
"yasal" bir program mantığı bakış açısı?) - numaralama typename RTTI, derleyici mesajları vb çeşitli yerlerde görünebilir. - belki yararlı, şaşırtmaca olabilir
- sen bir insan değilsin, bir sıralama olmadan çeviri birimi gerçekten görülmeye değer, yani çeteleler kütüphane API gereken değerleri açığa başlığı ve
make
ve diğer zaman damgası tabanlı tanımlanması tools tetik istemci derleme zaman onlar değişti (kötü!)
- consts
- düzgün kapsamlı / tanımlayıcı clash konular güzel işlenmiş
- güçlü, tek bir kullanıcı tarafından belirtilen türü
- "
#define
ala#define S std::string("abc")
ama sürekli kullanımı her noktada ayrı geçici tekrarlanan inşaat önler." türü deneyebilirsiniz
- "
- Bir Tanım Kural komplikasyonlar
- adresi alabilir, onları vb, sabit referanslar oluşturun.
- en eğer ikisi arasında geçiş durumunda iş minimize olmayan
const
değeri ve etkisi benzer - değeri uygulama dosyasının içinde, belirli bir süre yeniden derleyin ve istemci bağlantıları üstü almak için izin veren yerleştirilebilir
- tanımlar
- "global" kapsam / daha yatkın çelişkili kullanımları, hangi-ebilmek üretmek zor çözmek derleme sorunları ve beklenmedik çalışma zamanı sonuç yerine aklı başında hata iletileri; bu hafifletici gerektirir:
- uzun ve/veya merkezi olarak koordine belirsiz tanımlayıcılar, ve onlara erişim örtülü olarak Koenig-baktı-up AD, AD geçerli/kullanılan/eşleşen gelen diğer adları vb yararı olmaz.
- sırada önüne geçti en iyi uygulama sağlar şablon parametre tanımlayıcıları için tek karakter, büyük harf (büyük olasılıkla, ardından bir sayı), diğer kullanım tanımlayıcıları olmadan küçük harfler geleneksel ayrılmış ve beklenen işleyişi tanımlar (dışında işletim sistemi ve C/C kütüphane başlıkları). Bu kuruluş ölçeği ön işlemci kullanımı yönetilebilir kalması için önemlidir. 3. parti kütüphaneler uymaları beklenebilir. Bu mevcut consts göç anlamına gelir veya bir harf değişikliği içerir ve bu nedenle istemci kaynak kodu için düzenlemeler gerektirir tanımlar/çeteleler gözlem yerine "basit" yeniden derleyin. (Kişisel olarak, çok zaman belki de bu ikisi arasında geçiş bunu tekrar düşünmek vurmak diye numaralandırma ama consts ilk mektup yararlanmak,.)
- daha fazla derleme işlemleri mümkün: dize birleştirme, stringification (bunların boyutu alarak), tanımlayıcıları içine birleştirme
- olumsuz olduğu göz önüne alındığında
#define X "x"
ve bazı istemci kullanım ala"pre" X "post"
, eğer istediğin veya ihtiyacın için X yapmak bir çalışma zamanı değişken değişken yerine sabit kuvvet düzenlemeler için istemci kodu (yerine sadece derleme), Oysa bu geçiş daha kolay birconst char*
const std::string
verilen onlar zaten güç kullanıcı için birleştirmek birleştirme işlemleri (örneğin"pre" X "post"
string
)
- olumsuz olduğu göz önüne alındığında
- doğrudan tanımlanan bir sayısal hazır bilgi.
sizeof
kullanamazsınız - yazılmamış (GCC
unsigned
karşılaştırıldığında uyarmaz) - bazı derleyici/bağlayıcı/hata ayıklayıcı zincirleri seyir için azaltılmış olacak tanımlayıcısı mevcut, olmayabilir de "sihirli sayı" (dizeleri, her neyse...)
- adresi alamaz
- bu ikame değeri olmasına gerek yoktur yasal (ya da kesikli) bağlamında nerede #define oluşturulur, olarak değerlendirilen her noktaya kullanımı, böylece başvuru henüz ilan nesneler, bağlı "uygulama" e ihtiyaç yok önceden dahil, oluşturmak "sabit" gibi
{ 1, 2 }
de olabilir, yeniden diziler, ya#define MICROSECONDS *1E-6
vb. (kesinliklebu tavsiye değil!) __FILE__
__LINE__
gibi bazı özel şeyleri makro yerine dahil edilebilir- test için varlığı ve değeri
#if
tablolar için Koşullu kod dahil (daha güçlü daha bir post-önişleme "Eğer" gibi kod lazım değil derlenebilir değilse seçilmiş bu kadar basit),#undef
-ıne, yeniden tanımlama vb. - yerine metin eline:
- çeviri birim tarafından kullanılan, yani makro kitaplıkları için istemci kullanmak olmalı Başlığı,
make
ve diğer zaman damgası tabanlı tanımlanması tools tetik istemci derleme zaman onlar değişti (kötü!) - daha da dikkat istemci kod derlenir emin olmak için gerekli olduğu veya komut satırında (Makefile veya script tanım bir bağımlılık olarak listelenmiş olmalıdır tedariki gibi)
- çeviri birim tarafından kullanılan, yani makro kitaplıkları için istemci kullanmak olmalı Başlığı,
- "global" kapsam / daha yatkın çelişkili kullanımları, hangi-ebilmek üretmek zor çözmek derleme sorunları ve beklenmedik çalışma zamanı sonuç yerine aklı başında hata iletileri; bu hafifletici gerektirir:
Genel bir kural olarak, const
s kullanıyorum ve genel kullanımı diğer bir basitlik bu eski tembel programcı için cazip olsa da () en profesyonel seçeneği göz önünde bulundurun.
Bunu Paylaş:
&; statik sabit" vs " quot;#d...
Nasıl C özel statik, sabit bir harita ...
Neden't ben bir sınıfta olmayan i...
C statik sabit dize (sınıf üyesi)...
Tanımlama statik sabit sınıf tanımında...