如何摆脱以下符号转换警告?
How do I get rid of the following sign-conversion warning?
每当调用函数 initSetArray() 时,我都会收到以下警告:
error: conversion to ‘long unsigned int’ from ‘int’ may change the sign of the result [-Werror=sign-conversion]
setarray = (set*)malloc(sizeof(set) * number_of_sets);
函数 initSetArray 只是初始化 setarray。
void initSetArray(set *setarray, int number_of_sets, int number_of_blocks)
{
setarray = (set*)malloc(sizeof(set) * number_of_sets);
}
我已经定义了两个结构,用于上面定义的辅助函数:
typedef struct{
uint64_t tag; // For identifying the block
uint8_t valid; // Valid bit for the block
uint8_t dirty; // Dirty bit for the block
} block;
typedef struct{
uint64_t index; // For identifying the set
block* way;
} set;
我无法准确找出哪个变量属于 "long unsigned int" 类型。我该怎么做才能解决这个问题?
在此声明中
setarray = (set*)malloc(sizeof(set) * number_of_sets);
变量number_of_sets
是一个整数(int),因为它用在表达式中与sizeof
(size_t),所以值被转换为匹配。
size_t
通常是 unsigned long
。如果你不喜欢这个警告,这会解决它:
setarray = (set*)malloc(sizeof(set) * (size_t) number_of_sets);
malloc
函数接受一个 size_t
参数,size_t
为您的构建定义为 unsigned long int
(通常如此)。在你的通话中:
setarray = (set*)malloc(sizeof(set) * number_of_sets);
您正在将这样的 size_t
值(sizeof
运算符给出 size_t
)乘以(有符号的)int
变量 - 因此出现警告。
为了避免这种情况,可以 显式地将 number_of_sets
转换为 size_t
,如下所示:
setarray = (set*)malloc(sizeof(set) * (size_t)number_of_sets);
或者,更好的是,将该参数的类型更改为 size_t
:
void initSetArray(set *setarray, size_t number_of_sets, size_t number_of_blocks)
{
setarray = (set*)malloc(sizeof(set) * number_of_sets);
}
通常,当使用表示对象 'count' 或 'size' 的变量时,unsigned int 是可取的(除非你可以 真的 计数或尺寸为负数)。
警告是在非常严格的警告设置下产生的,因为值number_of_sets
从int
隐式转换为无符号类型unsigned long int
,这可能有一个违反直觉的值number_of_sets
.
的负值
要消除此警告,您可以:
更改 initSetArray
的原型以修复参数的类型:number_of_sets
和 numer_of_blocks
可能应该是 size_t
类型的无符号值无论如何:
void initSetArray(set *setarray, size_t number_of_sets, size_t number_of_blocks)
或者,您可以使用强制转换运算符添加显式转换:
void initSetArray(set *setarray, int number_of_sets, int number_of_blocks) {
setarray = (set*)malloc(sizeof(set) * (size_t)number_of_sets);
}
但是请注意,设置参数 setarray
的值对用作 initSetArray
参数的调用者变量没有影响。您应该 return 指针或将指针指向指针参数。
每当调用函数 initSetArray() 时,我都会收到以下警告:
error: conversion to ‘long unsigned int’ from ‘int’ may change the sign of the result [-Werror=sign-conversion]
setarray = (set*)malloc(sizeof(set) * number_of_sets);
函数 initSetArray 只是初始化 setarray。
void initSetArray(set *setarray, int number_of_sets, int number_of_blocks)
{
setarray = (set*)malloc(sizeof(set) * number_of_sets);
}
我已经定义了两个结构,用于上面定义的辅助函数:
typedef struct{
uint64_t tag; // For identifying the block
uint8_t valid; // Valid bit for the block
uint8_t dirty; // Dirty bit for the block
} block;
typedef struct{
uint64_t index; // For identifying the set
block* way;
} set;
我无法准确找出哪个变量属于 "long unsigned int" 类型。我该怎么做才能解决这个问题?
在此声明中
setarray = (set*)malloc(sizeof(set) * number_of_sets);
变量number_of_sets
是一个整数(int),因为它用在表达式中与sizeof
(size_t),所以值被转换为匹配。
size_t
通常是 unsigned long
。如果你不喜欢这个警告,这会解决它:
setarray = (set*)malloc(sizeof(set) * (size_t) number_of_sets);
malloc
函数接受一个 size_t
参数,size_t
为您的构建定义为 unsigned long int
(通常如此)。在你的通话中:
setarray = (set*)malloc(sizeof(set) * number_of_sets);
您正在将这样的 size_t
值(sizeof
运算符给出 size_t
)乘以(有符号的)int
变量 - 因此出现警告。
为了避免这种情况,可以 显式地将 number_of_sets
转换为 size_t
,如下所示:
setarray = (set*)malloc(sizeof(set) * (size_t)number_of_sets);
或者,更好的是,将该参数的类型更改为 size_t
:
void initSetArray(set *setarray, size_t number_of_sets, size_t number_of_blocks)
{
setarray = (set*)malloc(sizeof(set) * number_of_sets);
}
通常,当使用表示对象 'count' 或 'size' 的变量时,unsigned int 是可取的(除非你可以 真的 计数或尺寸为负数)。
警告是在非常严格的警告设置下产生的,因为值number_of_sets
从int
隐式转换为无符号类型unsigned long int
,这可能有一个违反直觉的值number_of_sets
.
要消除此警告,您可以:
更改
initSetArray
的原型以修复参数的类型:number_of_sets
和numer_of_blocks
可能应该是size_t
类型的无符号值无论如何:void initSetArray(set *setarray, size_t number_of_sets, size_t number_of_blocks)
或者,您可以使用强制转换运算符添加显式转换:
void initSetArray(set *setarray, int number_of_sets, int number_of_blocks) { setarray = (set*)malloc(sizeof(set) * (size_t)number_of_sets); }
但是请注意,设置参数 setarray
的值对用作 initSetArray
参数的调用者变量没有影响。您应该 return 指针或将指针指向指针参数。