gpt4 book ai didi

c++ - static_assert 在宏中,但也扩展为可以用作函数参数的东西

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:24 24 4
gpt4 key购买 nike

例如。我有扩展为 sizeof(x)/sizeof(x[0]) 的宏 CHARCOUNT(x)。我想使用 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 应该会导致编译时断言。任何指示都会有所帮助。

最佳答案

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

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

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

那么您就不需要对大小断言,因为您只能将函数与实际数组一起使用。

关于c++ - static_assert 在宏中,但也扩展为可以用作函数参数的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53132715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com