lang支持__null吗?

当我使用clang ++ 5.0版编译以下程序时,它会导致

  

错误:函数的初始值设定项看起来不像纯说明符

extern void print(void *ptr);

#define NULL __null

class IInterface
{
public:
    virtual void method1() = NULL;
};


int main()
{
    void *ptr = NULL;
    print(ptr);
    return 0;
}

c语似乎不支持__null?但是stackoverflow中的一些帖子建议clang支持__null。如果是这样,我为什么会收到此错误。有人可以建议这是怎么回事吗?

链接:https://godbolt.org/z/-f3Kf9

hyx_hyx_hyx 回答:lang支持__null吗?

纯虚函数的语法仅为= 0。例如,允许virtual void do_stuff() = 0,但不允许virtual void do_stuff() = nullptr

Clang确实支持__null,但是编译器内部并不用于声明虚函数。

NULL 可能可以用于纯虚函数的唯一原因是某些系统将其定义为0,但您不应依赖于此。某些编译器可能还会使用0LL(void*)0

如果可以的话,应使用nullptr而不是NULL来声明空指针。这是最好的解决方案,可以在较早的标准中进行仿真。

要声明纯虚函数,请使用= 0。这是声明纯虚函数的最简单且通常的方法。

,

这似乎是一种误解。使虚拟函数纯净与将其初始化为空指针不同。实际上,某些编译器会将纯函数的vtable条目设置为指向名为__cxa_pure_virtual或类似名称的特殊函数。

由于实际上并未初始化指针,因此不能在此处使用__nullNot even GCC 4.1 allows it.也不能使用nullptr,它是__null的标准替代品。只需在此处写= 0;

,

这是怎么回事:

  1. 由于某种原因,您使用的是内部编译器(__null)而不是标准的nullptr(最糟糕的是,旧的NULL已经在标准中,不需要您定义)

  2. 由于某种原因,您试图将__null(或NULL(或nullptr)用作纯虚函数说明符 。你不能那样做。应该是= 0。我相信GCC允许或曾经允许您做为扩展的工作;叮当声没有。

就这么简单!

您的下一步:

  1. 停止使用__null作为空指针;改用nullptr
  2. 对于纯虚函数说明符,请停止使用空指针。是= 0
本文链接:https://www.f2er.com/3149816.html

大家都在问