首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是llvm::NoneType和llvm::空?

什么是llvm::NoneType和llvm::空?
EN

Stack Overflow用户
提问于 2020-09-09 22:37:30
回答 1查看 253关注 0票数 0

我正在开发一个基于LLVM的C/C++项目的庞大代码库。这段代码不是我写的,我只是在阅读并试图理解它的含义。

例如,这段代码是我第一次遇到llvm::None

代码语言:javascript
复制
CallInst *CI = this->CreateCall(Func, None, VALUE_NAME("localPtr"));

这是CreateCall()函数的定义。

代码语言:javascript
复制
CallInst *CreateCall(Function *Callee, ArrayRef<Value *> Args,
                     const Twine &Name = "", MDNode *FPMathTag = nullptr) {
    return CreateCall(Callee->getFunctionType(), Callee, Args, Name, FPMathTag);
}

显然,在这里,llvm::None被传递给ArrayRef <Value *> Args

根据LLVM参考ArrayRef

表示对数组(内存中连续的0或多个元素)的常量引用,即开始指针和长度。它允许各种API轻松方便地获取连续的元素。这个类不拥有底层数据,在数据驻留在其他缓冲区(其生存期超过ArrayRef的缓冲区)的情况下,可以使用它。

我感到困惑的是,llvm::None被作为参数传递到这个参数中。

我找不到llvm::None的文档,但是我找到了声明它的文件。

代码语言:javascript
复制
//===----------------------------------------------------------------------===//
//
//  This file provides None, an enumerator for use in implicit constructors
//  of various (usually templated) types to make such construction more
//  terse.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_ADT_NONE_H
#define LLVM_ADT_NONE_H

namespace llvm {
/// A simple null object to allow implicit construction of Optional<T>
/// and similar types without having to spell out the specialization's name.
// (constant value 1 in an attempt to workaround MSVC build issue... )
enum class NoneType { None = 1 };
const NoneType None = NoneType::None;
}

#endif

我不明白文件中的这些评论是什么意思。所以它和1一样吗?它是用来做什么的?

如何将其传递到ArrayRef

EN

回答 1

Stack Overflow用户

发布于 2020-09-10 05:32:03

在LLVM中有许多类型为Optional<Something>的变量,例如具有可选错误或可选输出文件。NoneOptional和类似功能的助手,它让您可以简单而隐式地构造这样的东西。

如果您有一个类具有一个可选的文件描述符作为成员字段,那么您可以有一个构造函数,它接受一个文件,而另一个构造函数没有,并且None存在以简化第二个构造函数,可能是一个复制构造函数,等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63820438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档