[英]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.