在C代码中使用#define nullptr有什么缺点吗?

时间:2017-09-11 16:24:26

标签: c++ c

我正在编写一些将由C ++代码包含的头文件,也包含在C代码中。我更希望标头源代码保持一致,并且总是在这些标头中使用“nullptr”而不是NULL(或整数常量0)。

这带来了添加一段代码的可能性,例如:

#ifndef __cplusplus
#define nullptr 0      /* or ((void *)0) */
#endif

或者:

#include <stdio.h>
#ifndef __cplusplus
#define nullptr NULL
#endif

编辑:或者来自Ben Voigt的建议:

#ifndef __cplusplus
static const void *nullptr = 0;
#endif

问题是,这样做的缺点是什么?是否有一些理由为什么将nullptr添加到C ++但不添加到C?当C ++和C必须互操作时,这似乎会使代码更加一致和可读。

编辑:示例标题

#ifdef __cplusplus
extern "C" {
#endif

extern struct MyStruct *globalMyStruct;
extern int myFunc(struct MyStruct *ptr,int arg);

#ifdef __cplusplus
}
#endif

#define MYMACRO(x) ((globalMyStruct!=nullptr) ? myFunc(globalMyStruct,(x)) : -1)

即使MyStruct是C ++对象,C代码包含上述头文件并使用MYMACRO定义也是合法的。我想在C和C ++文件中包含上面的标题代码。但是如果我从C文件中包含上面的头文件,那么由于使用了nullptr,它将无法编译。

C代码包含指向C ++对象的指针是完全有效的,这些指针可以作为参数传递给函数(也许那些函数是用C ++编写的)。这只是C ++和C可以互操作的一种方式。

1 个答案:

答案 0 :(得分:1)

我的头顶有两个缺点:

  • NULL / 0和nullptr有不同的行为(as explained here)你不希望nullptr(宏)和nullptr(语言特征)有不同的行为,即使它们看起来一样,你呢? / LI>
  • 应该避免使用宏(尽可能在C中使用......)

编辑:我在旧版本的C ++(但不是C)中做的事情:

#if __cplusplus >= 201103L || (__cplusplus < 200000 && __cplusplus > 199711L)
//use C++ 11 nullptr
#else
    struct nullptr_t
    {
        template <class T>
            operator T* (){return (T*)0;}
    }nullptr;
#endif

它模仿nullptr的行为而不是宏。