man*_*ans 36 c++ static-assert data-structures
我想添加在编译期间检查结构大小的代码,以确保它是预定义的大小.例如,当我移植此代码或在编译期间添加/删除结构中的项时,我想确保此结构的大小为1024字节:
#pack(1)
struct mystruct
{
int item1;
int item2[100];
char item3[4];
char item5;
char padding[615];
}
Run Code Online (Sandbox Code Playgroud)
我知道如何在运行时使用如下代码执行此操作:
if(sizeof(mystruct) != 1024)
{
throw exception("Size is not correct");
}
Run Code Online (Sandbox Code Playgroud)
但如果我在运行期间这样做,那将浪费处理.我需要在编译期间执行此操作.
如何在编译期间执行此操作?
n. *_* m. 35
您可以在编译期间检查大小:
static_assert (sizeof(mystruct) == 1024, "Size is not correct");
Run Code Online (Sandbox Code Playgroud)
你需要C++ 11.Boost有一个针对pre-c ++ 11编译器的解决方法:
BOOST_STATIC_ASSERT_MSG(sizeof(mystruct) == 1024, "Size is not correct");
Run Code Online (Sandbox Code Playgroud)
请参阅文档.
Aar*_*aid 21
如果你没有C++ 11或Boost,你可以试试这个:
typedef char assertion_on_mystruct[( sizeof(mystruct)==1024 )*2-1 ];
Run Code Online (Sandbox Code Playgroud)
如果该语句为false,则此类型提供具有负大小的数组类型,并且您的编译器应该给出错误消息.如果为true,则大小为1,有效大小.例如,g ++给出:
template.cpp:10:70: error: size of array ‘assertion_on_mystruct’ is negative
Run Code Online (Sandbox Code Playgroud)
我承认这不是最有用的东西,因为它只告诉你错误的行号.但它是我能想到的最简单,最独立的技术.
更一般的宏是:
#define DUMB_STATIC_ASSERT(test) typedef char assertion_on_mystruct[( !!(test) )*2-1 ]
DUMB_STATIC_ASSERT( sizeof(mystruct)==1024 );
DUMB_STATIC_ASSERT( sizeof(my_other_struct)==23 );
DUMB_STATIC_ASSERT( sizeof(minimum_size_struct) >= 23 );
Run Code Online (Sandbox Code Playgroud)
从C++ 11开始,您可以static_assert在编译时处理:
static_assert(sizeof(mystruct) == 1024, "Size is not correct");
Run Code Online (Sandbox Code Playgroud)
如果大小不是1024字节,您将收到编译错误.
| 归档时间: |
|
| 查看次数: |
18052 次 |
| 最近记录: |