例如。我有一个扩展为 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);
应该导致编译时断言。
任何指针都会有所帮助。
答案 0 :(得分:7)
您应该使用std::extent
而不是该宏,它为不支持的类型(例如,无边界的数组,非数组类型)提供0。
对于您的用例,使用constexpr函数为您提供数组变量的大小会更合适,例如:
end_df == 10
然后,您无需声明大小,因为您只能将函数与实际数组一起使用。