名前フィールドのサイズをバイト単位または文字単位で取得したいとします。
struct record
{
int id;
TCHAR name [50];
};
sizeof(record.name)
動作しません。
これに対する解決策は、あなたが思うほどきれいではありません:
size_in_byte = sizeof(((struct record *) 0)->name)
size_in_chars = _countof(((struct record *) 0)->name)
Windows 以外のプラットフォームで 2 番目のものを使用する場合は、次を試してください。
#define _countof(array) (sizeof(array)/sizeof(array[0]))
最初にインスタンスを作成すると、機能します。
record r;
sizeof(r.name);
C++ の場合:
#include <iostream>
using namespace std;;
struct record
{
int id;
char name [50];
};
int main() {
cout << sizeof( record::name) << endl;
}
編集:これは C++0x コードであると何人かが指摘しているので、VC++ に関する不親切なコメントを撤回する必要があると思います。これは、私自身の C++ コードで使用したことのあるプログラミング構造ではありませんが、なぜ sizeof が C++03 でこのように機能しないのか不思議に思う必要があります。名前を渡すと、サイズがわかります。それがうまくいかないのは、いくらかの努力が必要だと思っていたでしょう。しかし、それがC++標準の驚異です:-)
record
型の名前ですが、record.name
そうではありません。どうにかして、構造体のインスタンスを介して name にアクセスする必要があります。Sorin の答えは、通常の C ソリューションです。
sizeof ((struct record*)0)->name;
これにより、 のインスタンスへの疑似ポインタ (または疑似インスタンスへのポインタ) が作成されstruct record
、メンバにアクセスして、name
その式が に渡されsizeof
ます。sizeof
ポインター式を評価しようとせず、サイズを計算するために使用するだけなので、機能します 。
まったく同じ問題について説明し、このスレッドで言及されているすべてのオプションと、もう少し多くのオプションを提供しているため、これを読みたいと思うかもしれません。
struct record
{
static const int kMaxNameChars=50;
int id;
TCHAR name [kMaxNameChars];
};
sizeof(TCHAR)*record::kMaxNameChars //"sizeof(record.name)"
//record::kMaxNameChars sufficient for many purposes.
移植性があり、完全に安全であり、IMO が未加工の配列の長さを明示することは良い習慣です。
(編集: コンパイラが可変長の配列の長さに動揺する場合は、C でマクロ化する必要があるかもしれません。その場合は、マクロの値に static const int を定義することを検討してください!)