给定以下结构体:
struct ExampleStruct {
char firstMember[8];
uint64_t secondMember;
};
是否有一种方法来编写一个静态断言来验证secondMember
的偏移量是8字节的一些倍数?
Offsetof
您可以使用cstddef
库带来的offsetof
marco。这里我首先得到偏移量,然后使用模数运算符检查它是否是8的倍数。然后,如果余数为0,则偏移量确实是8字节的倍数。
// Offset.cpp
#include <iostream>
#include <string>
#include <cstddef>
#include <stdarg.h>
struct ExampleStruct {
char firstMember[8];
uint64_t secondMember;
};
int main()
{
size_t offset = offsetof(ExampleStruct, secondMember);
if(offset%8==0)
std::cout << "Offset is a multiple of 8 bytes";
}
这里演示 Offsetof
with static_assert
或者根据这个问题的上下文,目标是有一个static_assert
。这和
// OffsetAssert.cpp
#include <iostream>
#include <string>
#include <cstddef>
#include <stdarg.h>
struct ExampleStruct {
char firstMember[8];
uint64_t secondMember;
};
int main()
{
size_t offset = offsetof(ExampleStruct, secondMember); // Get Offset
static_assert(offsetof(ExampleStruct, secondMember)%8==0,"Not Aligned 8 Bytes"); // Check if the offset modulus 8 is remainer 0 , if so it is a multiple of 8
std::cout << "Aligned 8 Bytes" << std::endl; // If Assert Passes it is aligned 8 bytes
}
这里演示类型使用
我使用std::size_t
类型,因为这是您通常用于存储变量,对象等大小的类型。还因为它根据cppreference.com扩展为std::size_t
表达式:
引用宏
offsetof
展开为std::size_t
类型的整型常量表达式,其值为指定类型对象的开头到其指定成员的偏移量(以字节为单位),包括填充(如果有)。
cpprefrence
cplusplus
如果你的字体有标准布局,你可以使用offsetof
宏:
#include <cstddef>
static_assert(offsetof(ExampleStruct, secondMember) % 8 == 0, "Bad alignment");
这个offsetof
宏产生一个常量表达式,如果不满足条件,可以使用静态断言来产生翻译错误。