我正在开发一个基于LLVM的C/C++项目的庞大代码库。这段代码不是我写的,我只是在阅读并试图理解它的含义。
例如,这段代码是我第一次遇到llvm::None
CallInst *CI = this->CreateCall(Func, None, VALUE_NAME("localPtr"));
这是CreateCall()
函数的定义。
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
的文档,但是我找到了声明它的文件。
//===----------------------------------------------------------------------===//
//
// 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
发布于 2020-09-09 21:32:03
在LLVM中有许多类型为Optional<Something>
的变量,例如具有可选错误或可选输出文件。None
是Optional
和类似功能的助手,它让您可以简单而隐式地构造这样的东西。
如果您有一个类具有一个可选的文件描述符作为成员字段,那么您可以有一个构造函数,它接受一个文件,而另一个构造函数没有,并且None
存在以简化第二个构造函数,可能是一个复制构造函数,等等。
https://stackoverflow.com/questions/63820438
复制