GCC - 由于类型转换警告而截断
GCC - Truncation due to type conversion warning
为什么编译器不会因从 uint32 到 uint8 变量类型的转换而抛出值截断?恰好是行 result = reg_value;
void read_byte_register(uint32_t u32_address_rd_byte_reg,
uint8_t *pu8_Data_rd_byte_reg)
{
uint8_t result;
uint32_t reg_value;
uint32_t *reg_ptr;
reg_ptr = (uint32_t *) u32_address_rd_byte_reg;
reg_value = *(reg_ptr);
result = reg_value;
*(pu8_Data_rd_byte_reg) = result;
}
构建命令。您可以看到它正在为 ARM Cortex M3 构建:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -pedantic -Wall -Wextra -g3 -T "linker_script.ld" -Xlinker --gc-sections -Wl,-Map,"output_map.map" --specs=nano.specs -o "output.elf"
如问题评论中所述添加标志 -Wconversion
解决了问题。显然它默认是禁用的。 -Wconversion
启用有关隐式类型转换的警告。附上有关警告的屏幕截图:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -pedantic -Wall -Wextra -Wconversion -g3 -T "linker_script.ld" -Xlinker --gc-sections -Wl,-Map,"output_map.map" --specs=nano.specs -o "output.elf"
为什么编译器不会因从 uint32 到 uint8 变量类型的转换而抛出值截断?恰好是行 result = reg_value;
void read_byte_register(uint32_t u32_address_rd_byte_reg,
uint8_t *pu8_Data_rd_byte_reg)
{
uint8_t result;
uint32_t reg_value;
uint32_t *reg_ptr;
reg_ptr = (uint32_t *) u32_address_rd_byte_reg;
reg_value = *(reg_ptr);
result = reg_value;
*(pu8_Data_rd_byte_reg) = result;
}
构建命令。您可以看到它正在为 ARM Cortex M3 构建:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -pedantic -Wall -Wextra -g3 -T "linker_script.ld" -Xlinker --gc-sections -Wl,-Map,"output_map.map" --specs=nano.specs -o "output.elf"
如问题评论中所述添加标志 -Wconversion
解决了问题。显然它默认是禁用的。 -Wconversion
启用有关隐式类型转换的警告。附上有关警告的屏幕截图:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O0 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -pedantic -Wall -Wextra -Wconversion -g3 -T "linker_script.ld" -Xlinker --gc-sections -Wl,-Map,"output_map.map" --specs=nano.specs -o "output.elf"