static_assert在宏中,但也可以扩展为可用作函数参数的内容

时间:2018-11-03 15:25:13

标签: c++ c++11 macros static-assert

例如。我有一个扩展为 echo "<script type='text/javascript'>alert('Successfully Register!');</script>"; echo "<script>document.location='detail.php?id=$id'</script>"; 的宏CHARCOUNT(x)。我想使用sizeof(x)/sizeof(x[0])来确保每个宏扩展都进行检查以查看结果是否大于2,以避免有人传递指向字符串的指针而不是指向字符数组的指针。

我想要这样的静态断言:

static_assert

此宏将用于确保字符串副本不超过缓冲区大小,例如:

static_assert(x) > 2

如果有人不小心传入了一个指针,其中CHARCOUNT将导致指向字符串的指针的长度,而不是我希望在编译时声明的字节数。

TCHAR szMyStr[10];
_tcscpy_s(szMyStr, CHARCOUNT(szMyStr), L"My result");

上面的const TCHAR* myChars = L"My result"; auto len = CHARCOUNT(myChars); 应该导致编译时断言。 任何指针都会有所帮助。

1 个答案:

答案 0 :(得分:7)

您应该使用std::extent而不是该宏,它为不支持的类型(例如,无边界的数组,非数组类型)提供0。

对于您的用例,使用constexpr函数为您提供数组变量的大小会更合适,例如:

end_df == 10

然后,您无需声明大小,因为您只能将函数与实际数组一起使用。