2010-04-07 18 views
11

#define yerine C kodunda hangi avantaj var? Her iki Açıkçası ön-işlemcisi çalışacaktırNeden #defines yerine C typedefs kullanılır?

void func() 
{ 
     UBYTE byte_value = 0; 

     /* Do some stuff */ 

     return byte_value; 
} 

olarak kullanılabilir zaman

Bir örnek olarak

, herhangi bir avantaj

#define UBYTE unsigned char 

fazla

typedef unsigned char UBYTE 

kullanılarak orada Bir #define'u genişletin, birile olmaz, ama bu bana belirli bir avantaj ya da dezavantaj gibi görünmüyor; Bir sorun olduğunda ya kullanımın yapı hatasıyla sonuçlanmayacağı bir durum düşünemiyorum.

cevap

23

bir düzen tipinde bir typedef yaparsanız, farkı göreceksiniz:

typedef unsigned char UCARY[3]; 
struct example { UCARY x, y, z; }; 

bir #define ile ... hayır, oraya gitmeyelim izin vermenizi yapmak.

[DÜZENLEME]: Diğer bir avantaj, bir hata ayıklayıcının genellikle typedefs'i bilmesi, ancak #defines'i bilmemesidir.

+9

Önişlemciyi deneyin: "Kötüye kullan, Kötüye kullan. Bana istediğini hisset!" +1 –

+0

Önişlemci istismarını adil bir şekilde yapıyorum, ancak başka bir yolu olmadıkça türler için değil. (Geçtiğimiz 20 yılda kodlar arası 64-bit tamsayı işlemek için kod yazarken * bir kere * gerek duydum. Bu, o sırada mevcut derleyiciler için şaşırtıcı bir şekilde zordu ve daha fazla #ifdefs ile bitti tercih edilen.) –

+0

İşaretçi türleri de işlev ... – hugomg

2

#define ile ön işlem sırasında tümüyle dizginin değiştirilmesidir. typedef yeni bir tür sunar. Bu, kodunuzdaki olası sorunları daha kolay bulmanızı sağlar ve herhangi bir derleyici size daha ayrıntılı bilgi verebilir.

+1

oldukça bir * yeni * türü değil - bu, varolan bir tür için bir takma addır, ancak bir tür, evet – philsquared

3

Eh, ++ bir C gelen perspektif, kodunuzu kullanarak bir C++ programcısı gibi bir şey olabilir: Artık

 
template<typename T> class String 
{ 
    typedef T char_type; 
    // ... 
}; 

, C kodunda, Yazdığınız eğer bir şey gibi:

 
#define char_type uint32_t // because I'm using UTF-32 

Eh, başlık dosyanızın kullanıcıları için ciddi sorunlara neden olacaksınız. Typedefs ile, typedef'in değerini farklı kapsamlar içinde değiştirebilirsiniz ... kapsamları #defines ile uyulmuyor.

Bu C'yi etiketlediğinizi biliyorum, ancak C programcıları ve C++ programcıları, başlıklarının birbirlerinin tarafından kullanılabileceğini fark etmeliler ... ve bu akılda tutulması gereken şeylerden biri.

2

1) Muhtemelen büyük avantaj temiz bir koddur. Genellikle makroları kötüye kullanmak, kodu, "makro çorba" olarak bilinen, bilinmeyen bir karmaşaya dönüştürür.

2) Bir yazım kullanarak yeni bir tür tanımlarsınız. Makronun kullanılması aslında metni değiştirir. Derleyici, typedef hataları ile uğraşırken kesinlikle daha yararlıdır.

2
  • Derleyici/hata ayıklayıcı türden haberi varsa hata ayıklayıcıları ve derleyici hata iletileri daha da yardımcı olur. (bu ayrıca, sabitleri kullanmanız ve mümkün olduğunda tanımlama yapmamanız da olabilir)
  • Diziler, diğerlerinin de
  • gösterdiği gibi, yazılanları daha küçük bir kapsamla sınırlayabilirsiniz (örneğin, bir işlev). C++ 'da daha doğru.
İlgili konular