2013-04-15 10 views
11
  • Bir enum bir "sabitler adlı toplama" dır örneğin var değil tip MyType_e

taşımaktadır Yani enum adı Ne işe yarar halde enum sabitleri için Numara isminin amacı nedir? <code>enum MyType_e {A, B, C};</code></li> <li>olanlar sabitleri numaralandırma dosyası kapsamında beyan edilmiş olması halinde enum yani ana kapsamda bildirilen ve isimsiz olduğunu, bu bir dizi eşdeğerdir:

  • yatan türü her zaman int yani int var = A olduğunu #define A 0 ifadeleri, tamamen yasal mı?

    EDIT Aşağıdaki yorumlar uyarınca, enumlar hakkındaki anlayışım oldukça hatalı görünüyor. Bir enum'un #define ifadeleriyle ilgisi yoktur.Enums are resolved at compile time, ve yazılmıştır.

  • +1

    Bu fikirleri aldığınız C standardının bölümlerini işaret edebilir misiniz? C ad alan adlarına sahip değil (en azından burada atıfta bulunduğunuzu düşünüyorum) ve enlemelerin her zaman int için altta yatan türü yok. Yoksa bu daha yeni bir C standardından mı? –

    +2

    @Anonymous: C99 standardının 6.7.2.2/3'ü "Bir numaralayıcı listesindeki tanımlayıcılar" int "..." olan sabitler olarak bildirilir. Bu, daha sonra söylemeye devam ettiği için, bu kafa karıştırıcı bir şeydir, "Her numaralanan tür" char ", imzalı bir tamsayı türü veya işaretsiz bir tamsayı türü ile uyumlu olmalıdır. "Yani sabitlerin kendileri" int ", ama" enum "türünün kendisi olmayabilir. "Ad alanı" ile, Vorac'ın "kapsam" anlamına geldiğini düşünüyorum. – jamesdlin

    +0

    @jamesdlin, Anonymous: Sorunun daha az hatalı olması için değiştirdim. Enumlar için uygulamaya bağımlı tip benim için bir haber. Oldukça ilginç. – Vorac

    cevap

    6

    enum tipinin kullanılması niyetini taşır.

    Bir argüman olarak enum sabitini alan bir işleviniz olduğunu varsayalım.

    void foo(int e); 
    

    değildir:

    void foo(enum MyType_e e); 
    

    geçerli girişler ne hakkında kendi kendini belgeleyen bir şey değildir. Ayrıca, enum türü için uyumsuz değerler iletmeye çalışırsanız, derleyici uyarı verebilir. ISO C99 şartnamesinden Ek I ("Ortak uyarılar"):

    Bir uygulama, birçok durumda uyarı üretebilir .... Aşağıdakiler, daha yaygın durumlardan birkaçıdır.

    [...]

    • değeri bu tür bir üyesi ya da aynı olan bir numaralandırma değişkendir bir numaralandırma sabit bağlanması ile başka bir numaralandırma tip bir nesnenin verilir Aynı sayım türünü (6.7.2.2) döndüren bir işlev veya türü. onun sabitleri tüm işlemek için bir enum tip ama ihmal üzerinde switch kullanmak ve bir default vaka yoksa

    Bazı derleyiciler (örneğin, gcc) bile uyarıları oluşturabilir.

    2

    Eğer mükemmel

    int var = A 
    

    varyant

    enum mytype var = A 
    

    documentatory nedenlerle daha iyi olduğunu söylemek çıkarabilirler.

    +1

    “Enum mytype var” veya 1 parametresinin 'enum mytype' türündeyken 1'i geçen 'var' için 1'i atamaya ne dersiniz? –

    +0

    @AlexeyFrunze Hiçbir şey bunu yapmanıza engel olmaz. – glglgl

    +0

    En azından yararlı bir uyarı alabilirsiniz. –

    1

    Yukarıdaki yanıtlar iyi ve doğru, sadece belirli hata ayıklayıcıları eklemek istiyorum, enum tür değişkeni üzerinde gezinirken veya dururken enum adını gösterebiliyoruz.Bu, özellikle devlet makine uygulamasındaki eyaletler için enumlar kullanıldığında netliğe yardımcı olur.

    İlgili konular