clang是否支持__null?

问题描述 投票:1回答:2

[当我使用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;
}

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

链接:__null

c++ c++14 clang++ llvm-clang
2个回答
8
投票

纯虚函数的语法仅为https://godbolt.org/z/-f3Kf9。例如,允许= 0,但不允许virtual void do_stuff() = 0

Clang确实支持virtual void do_stuff() = nullptr,但编译器内部并不打算声明虚函数。

__null 可能对于纯虚拟功能起作用的唯一原因是某些系统将其定义为NULL,但您不应依赖于此。某些编译器可能还会使用00LL

如果可以,则应使用(void*)0而不是nullptr来声明空指针。这是最好的解决方案,可以在较早的标准中进行模拟。

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


2
投票

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

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


1
投票

这里发生的是:

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

  2. 出于某种原因,您试图将NULL(或__null(或NULL))用作纯虚函数说明符

  3. 。你不能那样做。应该是nullptr。我相信GCC允许或曾经允许您做为扩展的工作;叮当声不响。

    真的就这么简单!

您的后续步骤:

  1. 对于空指针,请使用= 0停止;请使用__null
  2. 对于纯虚函数说明符,请停止使用空指针。是nullptr
© www.soinside.com 2019 - 2024. All rights reserved.