隐式转换的 gcc 警告标志
gcc warning flags for implicit conversions
我最近遇到了一个与下一个类似的错误:
double getSomeValue()
{
return 4.0;
}
...
std::string str;
str = getSomeValue();
正如您在此处看到的那样很容易发现问题,但在 getSomeValue()
与调用代码不在同一文件的大型代码库中,可能很难发现此 double
到 std::string
静默转换。 GCC 使用 -Wall -Wextra -Werror
可以很好地编译此代码(此处为示例输出,我不知道使用了哪些警告标志:http://ideone.com/BTXBFk)。
如何强制 GCC 对这些危险的隐式转换发出警告?我尝试了 -Wconversion
,但它非常严格,并且在 unsigned - 1
等常见情况下,大多数包含的 headers 都会导致错误。 -Wconversion
有没有弱一点的版本?
您可以使用 -Wfloat-conversion
标志,或更广泛的 -Wconversion
.
但是,请注意,使用 C++11 统一初始化大括号语法,您会收到警告 "out of the box",但没有 -Wconversion
标志;例如:
#include <string>
double getSomeValue() {
return 4.0;
}
int main() {
std::string str{ getSomeValue() }; // C++11 brace-init
}
C:\Temp\CppTests>g++ -std=c++11 test.cpp
test.cpp: In function 'int main()':
test.cpp:8:35: warning: narrowing conversion of 'getSomeValue()' from 'double' t
o 'char' inside { } [-Wnarrowing]
std::string str{ getSomeValue() };
^
您可以使用 -Wconversion
并避免 unsigned - 1
与 -Wno-sign-conversion
的错误,就像指定的 here.
我最近遇到了一个与下一个类似的错误:
double getSomeValue()
{
return 4.0;
}
...
std::string str;
str = getSomeValue();
正如您在此处看到的那样很容易发现问题,但在 getSomeValue()
与调用代码不在同一文件的大型代码库中,可能很难发现此 double
到 std::string
静默转换。 GCC 使用 -Wall -Wextra -Werror
可以很好地编译此代码(此处为示例输出,我不知道使用了哪些警告标志:http://ideone.com/BTXBFk)。
如何强制 GCC 对这些危险的隐式转换发出警告?我尝试了 -Wconversion
,但它非常严格,并且在 unsigned - 1
等常见情况下,大多数包含的 headers 都会导致错误。 -Wconversion
有没有弱一点的版本?
您可以使用 -Wfloat-conversion
标志,或更广泛的 -Wconversion
.
但是,请注意,使用 C++11 统一初始化大括号语法,您会收到警告 "out of the box",但没有 -Wconversion
标志;例如:
#include <string>
double getSomeValue() {
return 4.0;
}
int main() {
std::string str{ getSomeValue() }; // C++11 brace-init
}
C:\Temp\CppTests>g++ -std=c++11 test.cpp test.cpp: In function 'int main()': test.cpp:8:35: warning: narrowing conversion of 'getSomeValue()' from 'double' t o 'char' inside { } [-Wnarrowing] std::string str{ getSomeValue() }; ^
您可以使用 -Wconversion
并避免 unsigned - 1
与 -Wno-sign-conversion
的错误,就像指定的 here.