【发布时间】:2015-08-01 11:14:11
【问题描述】:
在我的/usr/include 目录中,至少有两个#define NULL 0 的变体是为C++ 代码量身定制的1:
#define NULL 0 // from rpc/types.h
#define NULL (0) // from libio.h
我觉得肯定有一个反例,第一个不安全,但我无法制作它。
否则,是否有一些令人信服的论据说明为什么在这种情况下不包括括号是安全的(例如,非正式的“正确性证明”)?
1 即不包括变体#define NULL ((void*)0),这对C很有用,但在C++中无效。
【问题讨论】:
-
在 C++ 中,无论如何你都应该使用
nullptr。 -
#define NULL (void*)0不是 C++ 中NULL的有效定义。 -
"...第一个不安全的地方" - 我更担心
(0)替代...允许一些奇怪的代码,如myfunc NULL致电myfunc(0)。 -
@PeterSchneider:我注意到 Mints97 对 unwind 答案的评论添加了
if NULL... 显然 [do]while NULL也是一个问题。相当狂野!我可以想象一个新手尝试int* p = new NULL int;并在地址0 获得unexpected placement new,但他们很可能会自己添加括号;-)。 -
@TonyD 我不认为反对是有效的,因为我们总是使用
#define FOUR (2+2)之类的东西来避免3*FOOR的问题,并且总是允许使用myfunc FOUR之类的奇怪代码。
标签: c++ c-preprocessor