如果你有一个结构体的实例,在C++中获取结构体字段的大小是很简单的。 如:(未编译)。
typedef struct Foo {
int bar;
bool baz;
} Foo;
// ...
Foo s;
StoreInSomething(s.bar, sizeof(s.bar)); // easy as pie
现在我仍然可以做这样的事情,但是我实现的接口(我得到一个BOOL,用来指示一个位域中特定位的状态),我创建结构只是为了得到数据成员的大小。 有没有办法向编译器表明它应该使用结构的字段大小,而不需要创建一个结构的实例? 这就相当于哲学上的。
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.)
}
在堆栈上创建结构应该是又快又便宜的 但我怀疑我这样做会在代码审查中被骂,所以我在寻找一个更好的方法,不会带来额外的维护负担(比如#定义大小)。
你可以使用一个表达式,例如
sizeof Foo().bar
作为参数的 sizeof
不被评估,只评估它的类型,实际上没有创建任何临时性的东西。
如果 Foo
不是默认可构造的(不像你的例子),你必须使用不同的表达式,比如涉及指针的表达式。(感谢Mike Seymour)
sizeof ((Foo*)0)->bar
typedef struct Foo {
typedef BarType int;
BarType bar;
bool baz;
} Foo;
...
sizeof(Foo::BarType)
你可以用指向结构的指针来使用sizeof of。考虑像下面这样的东西。
#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