Mar*_*tin 7 c casting type-conversion
在GCC中将int赋值给size_t(或在malloc中使用它)会产生以下警告:
警告:从'int'转换为'size_t'可能会更改结果的符号[-Wsign-conversion]
为了解决这个问题,我想将转换包装在一个函数中,该函数首先检查转换是否有效,然后进行转换.
这是我到目前为止:
/* Convert int src to size_t dst. */
/* Assumes dst points to valid size_t address. */
int safe_size_t_from_int(size_t *dst, int src) {
if(src < 0) return SAFE_ERROR_NEGATIVE;
if(SIZE_MAX < INT_MAX) {
if(src > (int)SIZE_MAX) return SAFE_ERROR_OVERFLOW;
}
*dst = (size_t)src;
return SAFE_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?是否存在已安装转换的库?
我能找到的最接近的东西是Microsoft Intsafe.h,但它似乎只适用于Win32类型.
编辑修改按照chux'评论.
为了避免在GCC中出现编译器警告,请将单个强制转换操作执行的操作限制为以下操作之一:
size_t始终是一个无符号类型,其大小足以容纳void指针。从int到size_t的转换涉及两个转换操作:扩展,然后删除有正负号。
这是在GCC 4.8.3上不产生编译器警告(带有'-Wall -Werror -Wextra')的两个函数。它们以行内返回值(通过哨兵值),而不是额外的返回参数。
int size_t2int(size_t val) {
return (val <= INT_MAX) ? (int)((ssize_t)val) : -1;
}
size_t int2size_t(int val) {
return (val < 0) ? __SIZE_MAX__ : (size_t)((unsigned)val);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21477 次 |
| 最近记录: |