为何存在类型不匹配的C++代码用GCC -Wall编译无警告?
为什么GCC加
-Wall编译这段代码没出类型不匹配警告? 你代码里的问题是调用add(a, b)时,long long类型的变量被隐式转换成了char和int——这属于窄化转换,确实有数据丢失风险,但-Wall本来就不会触发这类警告。
-Wall只是GCC的基础警告集合,它包含了常见的语法错误、逻辑问题警告,但不包含隐式窄化转换的检查。C++标准允许这种大类型转小类型的隐式转换,编译器默认认为这是合法行为,所以-Wall不会报错。
要捕捉这类转换警告,得额外加编译选项:
- 用
-Wconversion:会触发绝大多数隐式类型转换的警告,包括你代码里long long转char/int的情况。 - 要是只关注有符号和无符号之间的转换,可以单独加
-Wsign-conversion,不过-Wconversion已经覆盖了大部分这类场景。
比如执行g++ -Wall -Wconversion test.cpp编译你的代码,就能看到如下警告:
warning: conversion from 'long long' to 'char' may change value [-Wconversion] 13 | int x = add(a, b); | ^ warning: conversion from 'long long' to 'int' may change value [-Wconversion] 13 | int x = add(a, b); | ^
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

