Давайте рассмотрим следующий пример:
#include <stdio.h>
void func(unsigned char c) {
printf("0x%x\n", c);
}
int main() {
int val = 0x11223344;
func(val);
}
Насколько я знаю, нет возможности Я могу заставить gcc
или clang
показать предупреждение в утверждении func(val)
о сужении int
-> unsigned char
это произойдет там. Даже не компилируя с -Wall -Wextra -pedantic
. Вопрос касается, главным образом, C
кода, но стоит также включить в обсуждение мир C++
(см. Примечание ниже).
C ++ Note
Мне хорошо известно, что в C++
существует своего рода обходной путь, использующий унифицированный синтаксис инициализации :
func({val});
Но это не решает мою проблему, потому что:
- для ранее существовавшего кода, требуются изменения
- для нового кода, потребуется
{}
везде
Вопрос 1
Есть ли какая-то загадочная опция для достижения этого при компиляции кода C
или C++
? Я в порядке и с нестандартным решением, если оно работает с gcc
или clang
, и оно не требует изменения кода. Примечание: Я не ищу хитрых C++
решений, использующих пользовательские целочисленные типы с макросами или без макросов, которые обертывают примитивные типы. Я ищу что-то вроде параметра командной строки или pragma
. Опять же, вопрос в основном для кода C
, но стоит также изучить любые решения C++
.
Вопрос 2 (запасной вариант)
Если реальность окажется такой (как подозревается), такого решения не существует, мне было бы очень любопытно понять, почему. Я не могу поверить, что такой вариант просто никогда не рассматривался как реализованный. Должен быть список разумных аргументов против этого, о котором я просто не могу придумать. Но дело в том, что опция может быть просто нестандартной, как -fwrapv
, и люди могут использовать ее только там, где она действительно нужна.