如果你有一个struct的实例,那么在C ++中获取struct字段的大小是微不足道的。例如。 (未编译):
typedef struct Foo {
int bar;
bool baz;
} Foo;
// ...
Foo s;
StoreInSomething(s.bar, sizeof(s.bar)); // easy as pie
现在我仍然可以做这样的事情,但是我正在实现的接口(我得到一个BOOL,指示一个位域中特定位的状态应该是什么),我将仅创建结构获取数据成员的大小。有没有办法向编译器指示它应该使用struct字段的大小而不创建struct的实例?这将是哲学上的等同物:
SetBit(bool val) {
StoreInSomething(
BITFIELD_POSITION_CONSTANT, // position of bit being set
val, // true = 1, false = 0
sizeof(Foo::bar)); // This is, of course, illegal. (The method I've been told I must use req's the size of the target field.)
}
在堆栈上创建结构应该快速且便宜,但我怀疑我会在代码审查中得到它,所以我正在寻找一种更好的方法,不会引入额外的维护负担(例如#defines表示大小)。
答案 0 :(得分:38)
您可以使用以下表达式:
sizeof Foo().bar
由于sizeof
的参数未被评估,只有它的类型,实际上没有创建临时。
修改强>
如果Foo
不是默认可构造的(与您的示例不同),则必须使用不同的表达式,例如涉及指针的表达式。 (感谢Mike Seymour)
sizeof ((Foo*)0)->bar
答案 1 :(得分:7)
typedef struct Foo {
typedef BarType int;
BarType bar;
bool baz;
} Foo;
...
sizeof(Foo::BarType)
答案 2 :(得分:2)
您可以使用带有指向结构的指针的sizeof。考虑以下内容:
#include <stdio.h>
typedef struct Foo {
char cbar;
short sbar;
int bar;
bool baz;
long long llbar;
} Foo;
int main (void)
{
struct Foo *p_foo = 0;
printf("Size of cbar: %d\n", sizeof(p_foo->cbar));
printf("Size of sbar: %d\n", sizeof(p_foo->sbar));
printf("Size of bar: %d\n", sizeof(p_foo->bar));
printf("Size of baz: %d\n", sizeof(p_foo->baz));
printf("Size of llbar: %d\n", sizeof(p_foo->llbar));
}
其结果如下:
163> size.exe
Size of cbar: 1
Size of sbar: 2
Size of bar: 4
Size of baz: 1
Size of llbar: 8