加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 指向引用的指针的非空比较警告

发布时间:2020-12-16 06:52:31 所属栏目:百科 来源:网络整理
导读:我写了以下代码: void foo(int x){ bool b1 = (x) == nullptr; bool b2 = x == nullptr; int* ptr = x; bool b3 = ptr == nullptr;} 对于上面的代码,我遇到以下错误: 对于b1变量: test.cpp:5:21: warning: nonnull argument ‘x’ compared to NULL [-Wno
我写了以下代码:

void foo(int& x)
{
  bool b1 = (&x) == nullptr;
  bool b2 = &x == nullptr;
  int* ptr = &x;
  bool b3 = ptr == nullptr;
}

对于上面的代码,我遇到以下错误:

对于b1变量:

test.cpp:5:21: warning: nonnull argument ‘x’ compared to NULL [-Wnonnull-compare]

对于b2变量:

test.cpp:6:19: warning: the compiler can assume that the address of ‘x’ will never be NULL [-Waddress]

test.cpp:6:19: warning: nonnull argument ‘x’ compared to NULL [-Wnonnull-compare]

b3没有警告.

我理解为什么编译器返回一个警告,’x’永远不会为NULL.但是我不明白为什么这个警告只返回b2而不是b1.

另外,我真的不明白它是什么意思,’& x’是一个非空的论证.这是否意味着,指向引用的指针不是T *类型,但它有一个特殊类型,可以转换为T *?

如果它确实重要,我使用编译器g(GCC)6.2.1

谢谢你的所有提示.

解决方法

b2的额外消息的原因:因为’==’的左侧是x的地址 – 直接 – 编译器可以告诉比较的一个术语是立即评估的指针,所以可以发出警告.相比之下,对括号使用b1在括号中添加了一个间接级别 – 在括号外“,编译器只知道那是一个计算结果指针的表达式.由于很少单个项目在生产代码中以这种方式括起来,编译器编写者不会认为值得努力检查括号内的内容是否只是单个术语以发出相同的消息(假设编译器编写者甚至注意到了这个问题).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读