C++实现返回窄类型的自定义sizeof()的优化方案问询
问题背景
sizeof 默认返回 size_t 类型值,当把它的返回值作为参数传入接收更窄类型(如 unsigned char)的函数时,会发生隐式类型转换。这类函数多为第三方库提供,我无法修改其函数原型。
目前编译器通常可以智能检测这类转换是否会实际产生截断并给出警告,但部分静态代码分析器仍会标记所有此类场景,产生大量误报。对sizeof返回值做显式强制转换虽然可以消除分析器警告,但会同时屏蔽编译器的截断警告,且写法冗余笨拙。
现有实现方案
template<class T1, class T2> struct sizeofxx { static constexpr T2 value{ sizeof(T1) }; }; template <class T> constexpr unsigned int sizeof32 = sizeofxx<T, unsigned int>::value; template <class T> constexpr unsigned short sizeof16 = sizeofxx<T, unsigned short>::value; template <class T> constexpr unsigned char sizeof8 = sizeofxx<T, unsigned char>::value;
使用示例:
unsigned int foo = sizeof32<float>; const char bar[255]; unsigned char foo3 = sizeof8<decltype(bar)>;
该实现依赖聚合初始化机制在编译期拦截窄化转换:如果示例中bar数组长度为256,编译会直接失败。
现存局限与问询
目前该方案作用于变量时写法较为笨拙,需要借助decltype获取类型。我已知两种优化思路:
- 封装为宏:会导致Visual Studio等IDE无法在鼠标悬停时解析显示常量值
- 编写
constexpr函数,实现如下:
template <class T1> constexpr unsigned char sizeof8f(T1&) { return sizeof(T1); }
但该方式同样无法支持IDE编译期值解析,且由于需要和此前针对类型操作的实现做命名区分,会增加额外符号。
欢迎提供其他可从根因解决静态代码分析误报的方案,直接屏蔽警告的方式不可行。
内容的提问来源于stack exchange,提问作者wmjdgla
相关产品推荐
相关产品推荐

