3

名前フィールドのサイズをバイト単位または文字単位で取得したいとします。

struct record
{
    int id;
    TCHAR name [50];
};

sizeof(record.name)動作しません。

4

6 に答える 6

8

これに対する解決策は、あなたが思うほどきれいではありません:

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]))

于 2009-12-10T16:29:52.287 に答える
7

最初にインスタンスを作成すると、機能します。

record r;
sizeof(r.name);
于 2009-12-10T16:36:56.453 に答える
4

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++標準の驚異です:-)

于 2009-12-10T16:29:23.067 に答える
2

record型の名前ですが、record.nameそうではありません。どうにかして、構造体のインスタンスを介して name にアクセスする必要があります。Sorin の答えは、通常の C ソリューションです。

sizeof ((struct record*)0)->name;

これにより、 のインスタンスへの疑似ポインタ (または疑似インスタンスへのポインタ) が作成されstruct record、メンバにアクセスして、nameその式が に渡されsizeofます。sizeofポインター式を評価しようとせず、サイズを計算するために使用するだけなので、機能します 。

于 2009-12-10T16:50:52.823 に答える
1

まったく同じ問題について説明し、このスレッドで言及されているすべてのオプションと、もう少し多くのオプションを提供しているため、これを読みたいと思うかもしれません。

于 2009-12-10T17:02:05.850 に答える
1
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 を定義することを検討してください!)

于 2009-12-10T21:48:20.883 に答える