SORU
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ında X:: 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çek f(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 olmayanconst 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 bir const char* const std::string verilen onlar zaten güç kullanıcı için birleştirmek birleştirme işlemleri (örneğin "pre" X "post" string)
    • 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)

Genel bir kural olarak, consts 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ş:
  • Google+
  • E-Posta
Etiketler:
C++

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • julioissk84life

    julioissk84l

    18 ŞUBAT 2008
  • Sam Kear

    Sam Kear

    14 Temmuz 2007
  • tychoadragmire

    tychoadragmi

    20 Mart 2006