编译器通常会提供一个开关,以便在代码无法访问时发出警告.我还看到了一些库的宏,它们为无法访问的代码提供断言.
是否存在提示,例如通过编译指示或内置,我可以传递给GCC(或任何其他编译器),如果确定实际可以达到预期无法访问的行,则会在编译期间发出警告或错误?
这是一个例子:
if (!conf->devpath) {
conf->devpath = arg;
return 0;
} // pass other opts into fuse
else {
return 1;
}
UNREACHABLE_LINE();
Run Code Online (Sandbox Code Playgroud)
这个值的作用是在预期的不可达行之上的条件发生变化之后检测到该行实际上是可达的.
我最近在笔记本电脑上设置了MinGW + MSYS环境,以检查Netbeans C/C++支持的情况.一切似乎工作正常,但是,在我的测试中,我注意到GCC和Microsoft的cl.exe编译器之间存在差异.
这是一个示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int main(void) {
int i_max = INT_MAX;
char c_max = CHAR_MAX, c;
c = i_max;
printf("i_max: %d, c_max: %d, c: %d\n", i_max, c_max, c);
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
i_max: 2147483647, c_max: 127, c: -1
Run Code Online (Sandbox Code Playgroud)
正如您在上面的代码中看到的,我将一个int分配给一个char.这不应该产生警告,可能会发生数据丢失吗?微软的编译器(我配置得非常严格)会发出警告而GCC没有.
以下是我使用的GCC选项:
-g -Werror -ansi -pedantic -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)
我错过了一些GCC选项,使编译时检查更严格吗?
我们刚刚在我们的代码库中发现了一个问题,即语句在 return 语句之后。
例如
std::string MyClass::addElement(Type1 &item, const std::string ¶m2)
{
if (param2.empty())
{
// logging
return "";
}
return m_database->addElement(item, param2, item.status, true);
// here I would expect an unreachable code warning
m_database->updateTableA(item.p1, item.p2, item.p3, AType::AType23);
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是,为什么我们的编译器(GCC 4.8.5 和 7)不发出警告?
我们编译 -std=c++0x -Wall -Wextra -Wsign-compare -Wunknown-pragmas -Wold-style-cast -Wshadow -Wfatal-errors