我使用gcc8编译以下代码:
#include <iostream>
class person
{
public:
virtual void setage()=0;
};
void test(person &object)
{
if (&object == NULL) {
std::cout << "NULL object1" << std::endl;
}
if (!(&object))
{
std::cout << "NULL object1" << std::endl;
}
}
int main()
{
person *object=NULL;
person &object1=*object;
test(object1);
}
Run Code Online (Sandbox Code Playgroud)
然后,在编译并运行后会出现两个警告:
$ g ++ -std = c ++ 14 -pthread -fgnu-tm -O2 -Wall -Wextra -pedantic -pthread -pedantic-errors main.cpp -lm -latomic -lstdc ++ fs && ./a.out
main.cpp:在函数“ void test(person&)”中:
main.cpp:11:17:警告:编译器可以假定“对象”的地址永远不会为NULL [-Waddress]
Run Code Online (Sandbox Code Playgroud)if (&object == NULL) { ^main.cpp:15:18:警告:编译器可以假定“对象”的地址永远不会为NULL [-Waddress]
Run Code Online (Sandbox Code Playgroud)if (!(&object)) ^main.cpp:15:5:警告:nonnull参数'object'与NULL [-Wnonnull-compare]比较
Run Code Online (Sandbox Code Playgroud)if (!(&object)) ^~main.cpp:11:5:警告:nonnull参数'object'与NULL [-Wnonnull-compare]比较
Run Code Online (Sandbox Code Playgroud)if (&object == NULL) { ^~
objectin函数的地址test也不为NULL?object函数中的引用test永远不能为NULL,因此我们可以删除代码if (&object == NULL){...}并if (&object == NULL) {...}避免这两个警告,对吗?感谢您的提示。
Sto*_*ica 10
在格式正确的C ++程序中,引用绝不能为null。初始化引用的唯一有效方法是将其绑定到有效对象。可能发生“空引用”的唯一方法是,如果像您一样解引用空指针。但是,即使在您检查之前,程序的行为也是不确定的&object == NULL。该错误位于传递“空引用”的代码中,必须在此处修复。
因此,编译器警告您添加了多余的检查,该检查几乎没有保护您,因为需要修复的损坏代码不在您的函数之内。
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |