警告:编译器可以假设‘x’的地址永远不会为NULL

Posted

技术标签:

【中文标题】警告:编译器可以假设‘x’的地址永远不会为NULL【英文标题】:warning: the compiler can assume that the address of ‘x’ will never be NULL 【发布时间】:2019-04-13 18:43:29 【问题描述】:

我编写了以下代码并收到了两个警告。在线搜索仍然很混乱。

template <typename T>
LogMgr &operator << (const T &t)

    m_Stream << t;
    return *this;

警告:编译器可以假设‘t’的地址永远不会是NULL [-Waddress]

警告:与 NULL [-Wnonnull-compare] 比较的非空参数“t”

【问题讨论】:

这与编译器做出某些假设有关,这些假设可能会导致错误的代码。见rachid.koucha.free.fr/tech_corner/nonnull_gcc_attribute.html 请显示足够的代码来重现警告。 我发现错误消息不太可能指向那段特定的代码。从消息中,您似乎在某处使用if (&amp;t != NULL)... 什么是m_Streamm_Stream &lt;&lt; t 是做什么的?它会尝试打印t的地址吗? @1201ProgramAlarm m_Stream 是一个字符串流。是的,我正在使用重载的 【参考方案1】:

当您通过引用 (t) 传递参数时,它不能为 NULL。 (通过指针传递,可以为NULL)

【讨论】:

以上是关于警告:编译器可以假设‘x’的地址永远不会为NULL的主要内容,如果未能解决你的问题,请参考以下文章

在 NULL 表示为 0 的平台上,编译器是不是曾经为 NULL <= p 生成意外代码

在 NULL 表示为 0 的平台上,编译器是不是曾经为 NULL <= p 生成意外代码

csharp 表示永远不会赋值为null的引用类型。

堕落的工会案件没有警告错误

如果键不存在,C# Dictionary<int, int> 查找会发生啥?

另存为使用提供的文件名,但稍后在代码中更改为 null - 这导致文件永远不会被创建