簡體   English   中英

在C / C ++中獲取結構或聯合成員的字節大小或字符大小?

[英]Getting the size in bytes or in chars of a member of a struct or union in C/C++?

假設我想從以下位置獲取name字段的字節大小或字符:

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之外的其他平台上使用第二個,請嘗試:

#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不是。 你不知何故必須通過struct的實例訪問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中使用它。如果你這樣做,考慮將靜態const int定義為宏的值!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM