Почему мой код C++ с несоответствием типов компилируется без предупреждений с использованием флага GCC «-Wall»?

У меня есть следующий код:

#include <iostream>

char add(char a, int b)
{
    return a + b;
}

int main(void)
{
    long long a = 100000000;
    long long b = 20;

    int x = add(a, b);

    std::cout << x << std::endl;

    return 0;
}

И я не понимаю, почему мой код компилируется без каких-либо предупреждений.

Разве компилятор GCC с флагом -Wall не должен выдавать мне ошибку несоответствия типов?

🤔 А знаете ли вы, что...
Язык C++ позволяет работать с указателями и адресами памяти, что требует осторожности при программировании.


2
116
2

Ответы:

Решено

Это не ошибка, это допустимое неявное преобразование, хотя оно и предполагает сужение типа. Вы можете получить предупреждение об этом, например. -Weverything в лязге, который будет издавать

<source>:13:17: warning: implicit conversion loses integer precision: 'long long' to 'char' [-Wimplicit-int-conversion]
   13 |     int x = add(a, b);
      |             ~~~ ^
<source>:13:20: warning: implicit conversion loses integer precision: 'long long' to 'int' [-Wshorten-64-to-32]
   13 |     int x = add(a, b);
      |             ~~~    ^    

-Wall включает не все предупреждения. Если вам нужен именно этот, вам следует явно попросить об этом с помощью -Wconversion:

78623032.cpp: In function ‘char add(char, int)’:
78623032.cpp:5:14: warning: conversion from ‘int’ to ‘char’ may change value [-Wconversion]
    5 |     return a + b;
      |            ~~^~~
78623032.cpp: In function ‘int main()’:
78623032.cpp:13:17: warning: conversion from ‘long long int’ to ‘char’ may change value [-Wconversion]
   13 |     int x = add(a, b);
      |                 ^
78623032.cpp:13:20: warning: conversion from ‘long long int’ to ‘int’ may change value [-Wconversion]
   13 |     int x = add(a, b);
      |                    ^