c++ - 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
应该导致编译时断言。任何指针都会有所帮助。
解决方案
您应该使用std::extent
而不是那个宏,它为不支持的类型(例如,没有边界的数组、非数组类型)提供 0。
对于您的用例,为您提供数组变量大小的 constexpr 函数会更适合,如下所示:
template <typename T, std::size_t N>
constexpr std::size_t arrsize(T (&)[N]) {
return N;
}
然后你不需要断言大小,因为你只能使用实际数组的函数。
推荐阅读
- javascript - WebGL 集成禁用输入字段
- c# - 从 Sql 中检索图像,“参数无效”
- git - Azure devops 代码更改未在 github 中同步
- javascript - 我应该如何将变量从我的外部路由异步传递到 Node.js 中的 javascript 控制器?
- java - 通过 REST 控制器中的 Url 将空 ID 获取到后端
- c# - 我的委托永远不会在 .net 核心中触发
- php - 从 JSON URL 获取 DOI 值列表
- android - 如何在没有 ffmpeg 的 node.js 中编码 h.264
- amazon-web-services - Dynamo Stream Lambda - 每分钟只读取新记录
- java - 静态方法为所有变量返回值