У меня есть следующий код:
void foo(char* char_ptr, unsigned short len) {
char c = len != 0 ? char_ptr[0] : '\0';
printf("%c", c);
}
Я получаю следующее предупреждение:
Clang-Tidy: сужение преобразования из «int» в знаковый тип «char» определяется реализацией.
О какой конверсии идет речь? У меня везде только char
s. Как я могу избежать этой (потенциальной) ошибки?
Это похоже на еще один случай «происходит какая-то неявная магия, о которой вам просто нужно знать». Есть ли место, где я могу найти всю магию, которую неявно делает c-компилятор?
@EricPostpischil приведение только «\ 0» не отключает предупреждение. Как странно, что литерал с одинарными кавычками — это int, а не char!
@AdrianMole, выполняя все заявление, отключает предупреждение, спасибо
Интерпретируя информацию с этой страницы cppreference, а именно в разделе «Условный оператор», подразделы (3) и (1), мы видим:
(3) Выполняет преобразование результата оценки в общий тип, определяемый следующим образом:
(1) если выражения имеют арифметику тип, общий тип — это тип после обычных арифметических преобразований
Затем, глядя на связанные «обычные арифметические преобразования», мы видим:
(4) В противном случае оба операнда являются целыми числами. Оба операнда подвергаются целочисленные акции (см. ниже); затем, ...
Эти целочисленные преобразования приведут к тому, что оба выражения будут преобразованы в типы int
, даже если вы явно примените второе, как в char c = len != 0 ? char_ptr[0] : (char)'\0';
.
Итак, чтобы отключить предупреждение, результат условного выражения (который будет иметь тип int
) должен быть приведен к char
, как в:
char c = (char)(len != 0 ? char_ptr[0] : '\0');
Из этого проекта стандарта C11
6.5.15 Условный оператор
...
5 Если и второй, и третий операнд имеют арифметический тип, тип результата, который будет определяться обычные арифметические преобразования, применялись ли они к этим двум операндам, является типом результата.
Что, по-видимому, подтверждает информацию, представленную cppreference.com.
Re «Есть ли место, где я могу найти всю магию, которую неявно делает c-компилятор?»: Начните с стандарта C.