我正在处理一个相当统一的供应商提供的 API,并且希望以统一的方式检查和处理任何故障。为此,我编写了以下包装器:
template <typename Func, typename... Args>
auto awrap(Func &func, Args&&... args)
{
auto code = func(args...);
if (code >= 0)
return code;
... handle the error ...
};
...
awrap(handlepath, handle, path, NULL, 0, coll, NULL);
上面的代码可以通过 clang 编译,但是 g++13 和 Microsoft VC++ 都对两个 NULL 参数提出抱怨:
... error: invalid conversion from 'int' to 'const char*' [-fpermissive]
87 | auto code = func(args...
用 替换两个NULL
s 可以nullptr
解决问题,但是这有什么关系呢?
很可能,预处理器NULL
会将 转换为0x0
,甚至0
在某个地方,但原始调用从未引起“注意”。在以下情况下,使用 NULL 非常合适:
handlepath(handle, path, NULL, 0, coll, NULL);
为什么在包装器中使用时会出现问题(对于某些编译器而言)?
更新:/usr/include/sys/_null.h
我的 FreeBSD 系统上有以下代码:
#ifndef NULL
#if !defined(__cplusplus)
#define NULL ((void *)0)
#else
#if __cplusplus >= 201103L
#define NULL nullptr
#elif defined(__GNUG__) && defined(__GNUC__) && __GNUC__ >= 4
#define NULL __null
#else
#if defined(__LP64__)
#define NULL (0L)
#else
#define NULL 0
#endif /* __LP64__ */
#endif /* __GNUG__ */
#endif /* !__cplusplus */
#endif
所以:
对于 C,
NULL
是(void *)0
;对于 clang++ 来说
NULL
和nullptr
是同一件事,而对于 GNU 来说可能不是......