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ı
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. –
@ 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
'(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