在C/C++中获取结构或联合成员的字节大小或字符大小?

bog*_*dan 3 c c++ unicode sizeof

假设我想从以下位置获取name字段的字节大小或字符:

struct record
{
    int id;
    TCHAR name [50];
};
Run Code Online (Sandbox Code Playgroud)

sizeof(record.name) 不起作用.

sor*_*rin 8

对此的解决方案并不像您想象的那么漂亮:

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


Bri*_*ndy 7

如果您先创建一个实例,它将起作用.

record r;
sizeof(r.name);
Run Code Online (Sandbox Code Playgroud)


小智 5

在C++中:

#include <iostream>
using namespace std;;

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

int main() {
    cout << sizeof( record::name) << endl;
}
Run Code Online (Sandbox Code Playgroud)

编辑:有几个人指出这是C++ 0x代码,所以我想我必须撤回我对VC++的不友好评论.这不是我在自己的C++代码中使用过的编程结构,但我不得不想知道为什么sizeof在C++ 03中不能这样工作?你给它起一个名字,它给你的大小.我以为它不需要工作需要一些努力.但这就是C++标准的奇迹:-)

  • `sizeof(record :: name)`是一个可能在下一版C++(C++ 0x)中添加的功能.它还不是标准的,也不是广泛可用的. (5认同)
  • 在C++中,main()不必具有特定的返回值. (3认同)
  • 不.这里的问题本身并不是资格,而是在C++ 03中,除了成员访问或指向成员的指针之外,在任何上下文中引用非静态成员都是不合法的.所以`p-> f`是可以的,`p-> C :: f`是可以的,`&C :: f`是可以的,但`C :: f`本身不是.对于静态类成员或名称空间非类型成员,`C :: f`当然是一个合法的表达式,其求值为左值,任何表达式都可以是`sizeof`的操作数.对于类型的成员,`C :: T`是类型引用,并且在`sizeof`上下文中也是合法的.C++ 0x在这里添加了一个新的第三类`sizeof`. (2认同)