llvm输入输出流
llvm::raw_ostream
llvm::raw_ostream是一个抽象class,有两个重要的纯虚函数由子类实现,write_impl()保存将数据写入基础流的逻辑,current_pos()返回流中当前正在写入的位置。
llvm提供了以下输出流实现:
outs()
for writing to stdouterrs()
for writing to stderrnulls()
which discards the output (like writing to /dev/null)raw_fd_ostream(StringRef, std::error_code)
for writing to a file descriptorraw_string_ostream(std::string)
for writing to a std::string
前3个流直接返回其对象引用,如
llvm::raw_ostream &output = llvm:outs();
而fd/string流可使用抽象对象构造出来,如
//定义流对象 std::string str; llvm::raw_string_ostream output_str(str); std::string filename = "test_output.txt"); std::error_code ec; llvm::raw_fd_ostream output_file(filename, ec, sys::fs::F_Text); //定义函数,其中llvm::Value对象可直接使用流操作符输出来 void print_test(llvm::raw_ostream out) { llvm::Value tmp; out<<"test value "<< tmp; } //使用 print_test(output_str) print_test(output_file)
另外,每个llvm::Value*都有一个自己的print函数,只需把llvm::raw_ostream对象传入即可。
llvm::Value tmp; tmp->print(outs())
raw_fd_ostream构造附加内容
llvm::raw_fd_ostream在头文件llvm/Support/raw_ostream.h中声明。
共有以下6种构造方法:
//打开指定的文件(Filename)进行写入。如果发生错误,则将有关错误的信息输入EC,并应立即销毁这个stream。作为一种特殊情况,如果文件名是“-”,那么这个stream将使用STDOUT_FILENO而不是打开文件。这将不会关闭stdout描述符。 raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC); //CreationDisposition是枚举类型,共有4种: //(1) CD_CreateAlways(打开文件时,如果它已经存在,截断它;如果它还不存在,创建一个新文件)截断文件的意思是打开文件的时候先将文件的内容清空,再进行写入;并不是删除文件。 //(2) CD_CreateNew(打开文件时,如果它已经存在,fail;如果它还不存在,创建一个新文件) //(3) CD_OpenExisting(打开文件时,如果它已经存在,则打开文件,并将偏移量设置为0;如果它还不存在,fail) //(4) CD_OpenAlways (打开文件时,如果它已经存在,则打开文件,并将偏移量设置为0;如果它还不存在,创建一个新文件) raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC, sys::fs::CreationDisposition Disp); //FileAccess枚举类型:FA_Read和FA_Write。 raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC, sys::fs::FileAccess Access) raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC, sys::fs::OpenFlags Flags) /*Flags允许可选flags来控制文件将如何打开。枚举类型,共有9种: OF_None、F_None、OF_Text(以文本模式打开)、 F_Text、OF_Append (以追加模式打开)、 F_Append、OF_Delete (关闭时删除文件,只对windows有影响)、 OF_ChildInherit (启动子进程时,此文件应在子进程中保持打开状态)、 OF_UpdateAtime (强制文件在访问时更新,只对windows有影响)。 */ raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC, sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access, sys::fs::OpenFlags Flags) raw_fd_ostream::raw_fd_ostream (int fd, bool shouldClose, bool unbuffered = false) // FD是它要写入的文件描述符。如果ShouldClose为true,则在stream销毁时关闭文件。但是如果FD是stdout或stderr,它将不会关闭。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!