[英]How can I convert to size_t from int safely?
在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;
}
我錯過了什么嗎? 是否存在已安裝轉換的庫?
我能找到的最接近的東西是Microsoft Intsafe.h ,但它似乎只適用於Win32類型。
編輯修改按照chux'評論。
要避免GCC中的編譯器警告,請將單個強制轉換操作執行的操作限制為以下之一:
size_t始終是一個無符號類型,足以容納void指針。 從int到size_t的轉換涉及兩個強制轉換操作:extend,然后拋棄signed-ness。
這兩個函數在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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.