Предупреждение на char или int или short, long или unsigned - PullRequest
0 голосов
/ 01 мая 2018

Так как, похоже, нам следует избегать char или int или short или long или unsigned.

«Если вы обнаружите, что вводите char или int, short или long или unsigned в новый код, вы делаете это неправильно», с https://matt.sh/howto-c.

Можно ли поручить компилятору предупреждать об этом?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Компилятор никогда не предупредит об этом, потому что работа компилятора заключается в проверке соответствия языку, и эти типы прекрасно подходят для языкового стандарта.

Если вам нужен инструмент, который предупреждает об использовании опасных типов, вы можете получить программу проверки MISRA-C. Рекомендации MISRA-C используются для создания безопасного подмножества из небезопасного языка C. Помимо прочего, MISRA не позволяет использовать упомянутые типы, но вместо этого настаивает на том, что следует использовать только типы из stdint.h.

0 голосов
/ 13 мая 2018

Многие языковые конструкции определены в терминах встроенных типов. Код, который использует абстрактные типы, отличные от символьных типов, должен быть написан так, чтобы он работал одинаково хорошо, если были заменены большие типы, и код, который основывается на том, что абстрактные типы больше минимальных размеров, указанных в Стандарте, и которые любой может попытаться запустить в системах, где они не должны проверять, чтобы размеры соответствовали требованиям. Обратите внимание, что не имеет значения, объявляет ли код какие-либо объекты абстрактных размеров.

Например, при int16_t x; uint16_t y; на поведение (0xC000+x > 49152-y) будет влиять размер int. Если int равен 32 битам, то вычисления и сравнения будут выполняться с использованием значений со знаком. Однако, если int равно 16 битам, левый операнд будет оцениваться как 16-битное значение без знака, а затем переводится в long для сравнения с правой частью, которая будет оцениваться как long со знаком.

Хотя было бы удобно написать код, который мог бы быть независимым в отношении размеров абстрактных типов, простое притворство о том, что такие типы не существуют, не достигнет этого.

0 голосов
/ 01 мая 2018

Невозможно заставить компилятор предупреждать об этом. Там могут быть инструменты анализа кода, которые могут.

"Избегать их" на общих основаниях немного грубо. char гарантированно является одним байтом, используется для текста даже в C11, а стандартные библиотеки часто используют типы, зависящие от платформы, например, int как возвращаемое значение strcmp.

...