如何在编译时检查结构的大小?

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)

请参阅文档.

  • 注意:关于变通方法,非Boost解决方案只是`char const Array [sizeof(mystruct)== 1024?1:-1];`. (10认同)
  • 同意,但有些人不得不这样做. (4认同)

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++中,模板专业化方法通常是首选. (4认同)

Som*_*ude 6

从C++ 11开始,您可以static_assert在编译时处理:

static_assert(sizeof(mystruct) == 1024, "Size is not correct");
Run Code Online (Sandbox Code Playgroud)

如果大小不是1024字节,您将收到编译错误.