首页 > 解决方案 > static_assert 在宏中,但也可以扩展为可以用作函数参数的东西

问题描述

例如。我有CHARCOUNT(x)扩展为sizeof(x)/sizeof(x[0]). 我想static_assert用来确保每个宏扩展都会检查结果是否大于 2,以避免有人传入指向字符串的指针而不是指向字符数组的指针。

我想要这样的静态断言:

static_assert(x) > 2

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

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

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

const TCHAR* myChars = L"My result";
auto len = CHARCOUNT(myChars);

以上CHARCOUNT应该导致编译时断言。任何指针都会有所帮助。

标签: c++c++11macrosstatic-assert

解决方案


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

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

template <typename T, std::size_t N>
constexpr std::size_t arrsize(T (&)[N]) {
    return N;
}

然后你不需要断言大小,因为你只能使用实际数组的函数。


推荐阅读