相关疑难解决方法(0)

如何提示GCC在编译时无法访问一行?

编译器通常会提供一个开关,以便在代码无法访问时发出警告.我还看到了一些库的宏,它们为无法访问的代码提供断言.

是否存在提示,例如通过编译指示或内置,我可以传递给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)

这个值的作用是在预期的不可达行之上的条件发生变化之后检测到该行实际上是可达的.

c gcc pragma built-in unreachable-code

13
推荐指数
3
解决办法
7387
查看次数

GCC - 在为char分配int时不应该发出警告吗?

我最近在笔记本电脑上设置了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选项,使编译时检查更严格吗?

c gcc mingw

7
推荐指数
1
解决办法
533
查看次数

没有警告的返回语句后的代码

我们刚刚在我们的代码库中发现了一个问题,即语句在 return 语句之后。

例如

std::string MyClass::addElement(Type1 &item, const std::string &param2)
{
    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

c++ gcc dead-code compiler-warnings

4
推荐指数
1
解决办法
156
查看次数