2017-06-19 36 views
9

Bir dizideki elementlerin sayısı hesaplamak için klasik bir makro budur. Bu makronun yalnızca gerçek bir diziyle kullanılmasını sağlamak için taşınabilir bir yol var mı?Eğer argüman bir dizi olup olmadığını test etmek için countof() yolu var mı? bağımsız değişken bir dizi yerine bir işaretçidir</p> <pre><code>#define countof(a) (sizeof(a)/sizeof(*(a))) </code></pre> <p>bu sorun, sessizce başarısız:

#define assert_array(a) \ 
    (sizeof(char[1 - 2 * __builtin_types_compatible_p(typeof(a), typeof(&(a)[0]))]) - 1) 

O gcc ve clang hem çalışır: taşınabilir olmayan bir yerleşik işlevinin kullanılması

+1

Derleme zamanı, sizeof (& table [0])! = Sizeof (table [0]) olduğunu ve çoğul durumlarda çoklu üye yapıları söz konusu olduğunda orada olacağınızı iddia eder. Bir işaretçinin boyutu, bir işaretçiye işaretçinin de büyüklüğüdür. Yapılar için bu sadece çok basit bir yapı için doğru olabilir. Mükemmel değil, çoğu durumda hedefinize oldukça yakın. Ve taşınabilir. –

+0

@ B.Nadolson Bazı özel durumlar için işe yarayabilse de, muhtemelen onu kullandığınız yer hakkında çok fazla yorumda bulunacağım (en azından sürpriz olarak). Bu kontrolün düzgün çalışmadığı birçok durum vardır, ancak bir programcı bunu varsaydığını düşünebilir. – tangrs

+1

'(intptr_t) & table == (intptr_t) table' özelliği, bir dizi için geçerlidir; işaretçi, yalnızca kendisinin işaret ettiği noktaya aitse, nadirdir. – Marian

cevap

4

, burada a bir dizi olduğunu statik iddiayı gerçekleştirmek için bir makrodur. Ben countof() makro daha güvenli yapmak için kullanabilirsiniz:

#define countof(a) (sizeof(a)/sizeof(*(a)) + assert_array(a)) 

Ama bu sorun için bir portatif bir çözüm yoktur.