我们现在拥有许多新功能的C++ 11.一个有趣且令人困惑的(至少对我来说)是新的nullptr
.
嗯,不再需要令人讨厌的宏了NULL
.
int* x = nullptr;
myclass* obj = nullptr;
Run Code Online (Sandbox Code Playgroud)
尽管如此,我还没有得到如何nullptr
运作.例如,维基百科的文章说:
C++ 11通过引入一个new 关键字作为一个区分空指针常量来解决这个问题:nullptr.它的类型为nullptr_t,它是可隐式转换的,可与任何指针类型或指向成员类型的类型相媲美.除了bool之外,它不可隐式转换或与整数类型相比.
它是一个关键字和一个类型的实例?
另外,你有另一个例子(在维基百科旁边)哪里nullptr
优于好老0
?
检查指针是不是NULL
通过简单写入if(pointer)
或我必须使用它是否安全if(pointer != NULL)
?
我正在为地址0x0000有效且包含端口I/O的系统编写C代码.因此,访问NULL指针的任何可能的错误都将保持不被检测到,同时会导致危险的行为.
出于这个原因,我希望将NULL重新定义为另一个地址,例如一个无效的地址.如果我不小心访问了这样的地址,我将得到一个硬件中断,我可以处理错误.我碰巧有权访问此编译器的stddef.h,因此我实际上可以更改标准头并重新定义NULL.
我的问题是:这会与C标准发生冲突吗?据我所知,从标准中的7.17开始,宏是实现定义的.标准中的其他地方是否有任何内容表明NULL 必须为0?
另一个问题是,无论数据类型如何,大量编译器都会通过将所有内容设置为零来执行静态初始化.尽管标准规定编译器应将整数设置为零并将指针设置为NULL.如果我将为我的编译器重新定义NULL,那么我知道这样的静态初始化将失败.我是否可以将其视为不正确的编译器行为,即使我手动大胆地更改了编译器头?因为我确实知道这个特定的编译器在进行静态初始化时不访问NULL宏.
标准说,取消引用空指针会导致未定义的行为.但是什么是"空指针"?在下面的代码中,我们称之为"空指针":
struct X
{
static X* get() { return reinterpret_cast<X*>(1); }
void f() { }
};
int main()
{
X* x = 0;
(*x).f(); // the null pointer? (1)
x = X::get();
(*x).f(); // the null pointer? (2)
x = reinterpret_cast<X*>( X::get() - X::get() );
(*x).f(); // the null pointer? (3)
(*(X*)0).f(); // I think that this the only null pointer here (4)
}
Run Code Online (Sandbox Code Playgroud)
我的想法是,只有在最后一种情况下才会取消引用空指针.我对吗?根据C++标准,编译时空指针和运行时之间是否存在差异?
C++11引入了nullptr
我没有的关键字。
我想有NULL
来自 C的宏,我从这里和这里的一些东西中读到了在 C++ 中使用的宏,但我仍然不确定在这个旧的 C++ 标准中检查空指针的正确方法是什么。
我基本上希望能够使用 Boost Test 为我的测试用例编写此代码:
aWrapperDataStructure x;
BOOST_CHECK_NE(x.get_ptr(), static_cast<decltype(x.get_ptr())>(nullptr));
Run Code Online (Sandbox Code Playgroud)
但也许,正如 Tutorials Point 建议的那样,考虑到限制,这样的事情更合适:
BOOST_CHECK(x.get_ptr()); //true when not NULL
Run Code Online (Sandbox Code Playgroud)
不过,关于这方面的一些事情让我感到厌烦,所以我想知道这里的最佳做法是什么。如果它在网上的某个地方,或者在 SO 上,它已经被埋藏很久了,我找不到它。谢谢!
有时我看到程序员使用:
void *ptr = <something>;
if (ptr == NULL)
<do something>;
Run Code Online (Sandbox Code Playgroud)
代替:
void *ptr = <something>;
if (!ptr)
<do something>;
Run Code Online (Sandbox Code Playgroud)
有什么可以出错if (!ptr)
,或者只是一种编码风格偏好?
c++ ×3
null-pointer ×3
pointers ×3
c ×2
null ×2
c++11 ×1
c++98 ×1
dereference ×1
if-statement ×1
nullptr ×1