C++-当sizeof(A) < sizeof(B)时,使编译器报错

C++-当sizeof(A) < sizeof(B)时,使编译器报错

夜无邪 发布于 2016-11-29 字数 527 浏览 1477 回复 4

sizeof(struct)的值相当于一个全局变量const size_t,那么,怎样写一个语句
使sizeof(A) < sizeof(B)在编译期报错呢?
比我们写上一堆CQ_ASSERT要强多了。

下面是小弟试过的想法,都不能完成需求....窘

#define AHAHA 3  //但是不能写成 #define AHAHA sizeof(int)
#if AHAHA != 3
int = 2;
#endif

void main()
{
if (sizeof(char) > sizeof(double))
{
#pragma message("error") //无论if真假,只要编译到,就会显示
}
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

晚风撩人 2017-07-27 4 楼

C++11的static_assert

 static_assert(sizeof(A) <= sizeof(B), "error: A > B");

清晨说ぺ晚安 2017-06-06 3 楼

如果是C++11的话,可以使用static_assert。
再static_assert之前,还有些其他方法可以来实现类似的功能。比如这些宏:

#define STATIC_ASSERT_2(ex)
do { typedef int ai[(ex) ? 1 : 0]; } while(0)

# define STATIC_ASSERT_3(ex)
do { typedef int ai[(ex) ? 1 : -1]; } while(0)

#define STATIC_ASSERT_4(ex)
switch(0) { case 0: case ex:; }

#define STATIC_ASSERT_5(ex)
struct x { unsigned int v : ex; }

这行就会再编译期报错。
STATIC_ASSERT_1(sizeof(int) < sizeof(short))

想挽留 2017-05-04 2 楼

可以这样
template<typename T1,typename T2>
void check_size()
{
int testArray[sizeof(T1) < sizeof(T2)];
}
然后当你写check_size<double,char>()的时候,就会报错,因为数组初始化的结果不能为0。

template<typename T1,typename T2>
void check_size()
{
int dmp[sizeof(T1) < sizeof(T2)];
}

int _tmain(int argc, _TCHAR* argv[])
{
check_size<double,int>();
}

报错信息:
error C2466: cannot allocate an array of constant size 0
see reference to function template instantiation 'void check_size<double,int>(void)' being compiled
error C2133: 'dmp' : unknown size

虐人心 2017-04-10 1 楼

#pragma是预处理指令,sizeof应该是编译时期才有编译器确定的。
如果要在编译期报错的话,可以使用C++模板的偏特化特性。

 //声明一个模板参数为bool类型的类模板
template<bool>
class CompileTips;

//偏特化一个参数为true版本
template<>
class CompileTips<true>
{
}

//下面语句编译期会报错,因为编译期找不到参数为false的版本
CompileTips<sizeof(int) < sizeof(char)>();