Joh*_*ohn 1 c++ macros static-assert c++11
例如.我有CHARCOUNT(x)扩展到的宏sizeof(x)/sizeof(x[0]).我想static_assert用来确保每个宏扩展检查结果是否大于2,以避免有人传入指向字符串的指针而不是指向字符数组的指针.
我想要像这样的静态断言:
static_assert(x) > 2
Run Code Online (Sandbox Code Playgroud)
此宏将用于确保字符串副本不超过缓冲区大小,例如:
TCHAR szMyStr[10];
_tcscpy_s(szMyStr, CHARCOUNT(szMyStr), L"My result");
Run Code Online (Sandbox Code Playgroud)
如果有人意外地传入一个指针,其中CHARCOUNT将导致指向字符串的指针的长度,而不是我希望在编译时断言的字节数.
const TCHAR* myChars = L"My result";
auto len = CHARCOUNT(myChars);
Run Code Online (Sandbox Code Playgroud)
在CHARCOUNT上述应导致编译时断言.任何指针都会有所帮助.
您应该使用std::extent而不是该宏,它为不支持的类型提供0(例如,没有边界的数组,非数组类型).
对于您的用例,constexpr函数为您提供数组变量的大小将更适合,如下所示:
template <typename T, std::size_t N>
constexpr std::size_t arrsize(T (&)[N]) {
return N;
}
Run Code Online (Sandbox Code Playgroud)
然后您不需要断言大小,因为您只能将函数与实际数组一起使用.