#c #gcc #casting #codeblocks
#c #gcc #Кастинг #codeblocks
Вопрос:
Я скомпилировал следующий код в Code::Blocks — gcc :
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void test_print(uint8_t test_var);
int main()
{
uint32_t var = 100000U;
test_print(var);
return 0;
}
void test_print(uint8_t test_var)
{
printf("test_var = %dn", test_var);
}
Почему оно не вызывает никаких предупреждений?
Мне это кажется странным, поскольку я неявно преобразую U32 в U8. (чего следует избегать, поскольку информация будет потеряна в процессе)
Комментарии:
1. Вы тестировали
-Wall
?2. Это не обязательно. Это преобразование совершенно законно. Тем не менее, я предполагаю, что это может предупреждать с некоторыми настройками предупреждения.
3. Это очень часто делается специально, чтобы намеренно отбросить старшие биты, или когда известно, что они не важны или уже равны нулю. Поэтому, если бы предупреждение было включено по умолчанию, это, вероятно, просто раздражало бы большинство людей.
Ответ №1:
Вам нужно будет использовать -Wconversion
флаг для gcc, который подхватит это:
[dbush@db-centos7 ~]$ gcc -Wconversion -g -Wall -Wextra -o x1 x1.c
x1.c: In function ‘main’:
x1.c:11:5: warning: conversion to ‘uint8_t’ from ‘uint32_t’ may alter its value [-Wconversion]
test_print(var);
Это один из тех флагов, который не включен в -Wall
or -Wextra
.