Yapılar için neden typedefs kullanılır?


12

C'de (ANSI, C99, vb.), yapılar kendi ad alanlarında yaşar. Bağlantılı bir liste için bir yapı şöyle görünebilir:

struct my_buffer_type {
   struct my_buffer_type * next;
   struct my_buffer_type * prev;
   void * data;
};

Bununla birlikte, çoğu C programcısı için aşağıdaki gibi bu yapıları otomatik olarak yazmak oldukça doğal görünmektedir.

typedef struct tag_buffer_type {
   struct tag_buffer_type * next;
   struct tag_buffer_type * prev;
   void * data;
} my_buffer_type;

Ve sonra yapıya normal bir tip gibi bakın, yani get_next_element(my_buffer_type * ptr).

Şimdi sorum şu: Bunun özel bir nedeni var mı?

Wikipedia diyor ki http://en.wikipedia.org/wiki/Typedef#Usage_concerns

Bazı insanlar, typedef'lerin yaygın kullanımına karşı çıkıyorlar. Çoğu argüman, typedef'lerin bir değişkenin gerçek veri türünü gizlemesine odaklanır. Örneğin, bir Linux çekirdek korsanı ve belgeseli Greg Kroah-Hartman, işlev prototip bildirimleri dışında herhangi bir şey için kullanılmalarını engelliyor. Bu uygulamanın sadece gereksiz yere kodu şaşırtmakla kalmayıp, aynı zamanda programcıların büyük yapıları yanlışlıkla basit tipler olduğunu düşünerek kötüye kullanmasına neden olabileceğini savunuyor. [4]

Diğerleri, typedefs kullanımının kodun bakımını kolaylaştırabileceğini savunuyor. K&R, typedef kullanmanın iki nedeni olduğunu belirtir. İlk olarak, bir programı daha taşınabilir hale getirmek için bir yol sağlar. Programın kaynak dosyaları boyunca göründüğü her yerde bir türü değiştirmek yerine, yalnızca tek bir typedef deyiminin değiştirilmesi gerekir. İkinci olarak, bir typedef karmaşık bir bildirimin anlaşılmasını kolaylaştırabilir.

Şahsen struct, bazen typedef'd yapıları kullanmamak için ayrı bir ad alanına sahip olmanın yeterli faydası olup olmadığını merak ediyorum. farkında olmadığım gelenekler.

O zaman tarihsel düşüncelerle ilgileniyorum (selefler, C'nin ilk versiyonları).


4
Bir amacı typedef olan bir değişkenin asıl türünü gizlemek için. Al time_törnek olarak: insanlar etrafında yatan tamsayı türünü kullanarak giderseniz, böyle uygulanmasında bir değişiklik kod çok şey kıracak 2038 yılında gerekecektir biriydi. People İnsanlar yapıları nedenini anlamadan kullanıyorlarsa, bu yapıda değil programcıda başarısızlıktır.
Blrfl

Yanıtlar:


14

Geniş çaplı typedef'd yapıları kullanan büyük bir proje üzerinde çalıştım. Bunu birkaç nedenden dolayı yaptık. Lütfen bunun C99 öncesi ve ad alanı ayrımı olduğunu unutmayın.

  1. Büyük bir fark yaratan kod tabanının (1M + loc) my_buffer_type *bufferyerine yazılması daha kolaydı struct tag_buffer_type *buffer.

  2. Yapıyı bir nesneye soyutlar. Yapı içindeki her bir değişkene odaklanmak yerine, temsil ettiği veri nesnesine odaklanırdık. Bu soyutlama genellikle daha kullanışlı ve daha kolay kod yazılmasına yol açtı.

    • Sanırım bu, sağladığınız Greg Kroah-Hartman'a atfedilen sözle doğrudan çelişiyor. FWIW, bu proje bir çekirdek değil, bir istemci / sunucu uygulamasıydı, bu yüzden dikkate alınması gereken bazı farklı hususlar var.
  3. Yapıyı bir nesne olarak ele almak da bilgiyi daha iyi kapsülleyebilmemizi sağladı. Kod incelemesi, daha yeni bir geliştiricinin uygulamaya koyduğumuz kapsülleme ilkelerini ihlal edeceği birkaç durum yakaladı. Typedef'd yapıları kullanmak bu ihlalleri gerçekten açıkça ortaya koydu.

  4. Sunucu ile yarım düzine platform ve istemci ile birkaç tane daha yazdığımız için taşınabilirlik bir endişeydi.


5

Yazmak yerine her seferinde

struct my_buffer_type *buffer;

eğer sen typedefdoğrudan kullanabilirsiniz

my_buffer_type *buffer;

typedefTemel kullanım alanı kod yazmak için gerekli tuş vuruşlarını azaltmak ve okunabilirliği arttırmaktır.


haklısın ama bu gerçeği zaten soruma açıkladım.
wirrbel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.