У меня есть следующий код:
#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++ позволяет работать с указателями и адресами памяти, что требует осторожности при программировании.
Это не ошибка, это допустимое неявное преобразование, хотя оно и предполагает сужение типа. Вы можете получить предупреждение об этом, например. -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);
| ^