我怎样才能得到一个const在编译时的价值?

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

我的目标是创建在需要用户提供的存储器块具有一定尺寸的C API。这个尺寸正好是我的防锈库结构的大小,所以我想提取防锈结构的大小,并将其放置在头文件作为一个C宏。

问题是,我交叉编译我的图书馆,所以我不能运行我的计算机上的程序,打印core::mem::size_of::<MyStruct>()。但我可以说值存储在我的图书馆const变量。

有没有什么方法来提取代表我的结构的大小在编译的时候,这样我就可以将其粘贴到C头文件这个const变量的值?

rust compile-time
1个回答
1
投票

绝对不这样做:

  1. 在新箱,进口有问题的类型,并创建返回其尺寸的功能: #[no_mangle] pub fn size_of_mystruct() -> usize { std::mem::size_of::<MyStruct>() }
  2. 获取LLVM-IR输出: CARGO_INCREMENTAL=0 cargo rustc -- --emit=llvm-ir -o ir 确保添加--target选项了。这将创建一些文件,其中一个应该有扩展.ll。该CARGO_INCREMENTAL=0是很重要的 - 没有它,它会创造大量的.ll文件,谁知道这是正确的!打开文件,然后搜索size_of_mystruct。你会发现这样的事情: ; Function Attrs: uwtable define i64 @size_of_mystruct() unnamed_addr #0 !dbg !142 { start: ; call core::mem::size_of %0 = call i64 @_ZN4core3mem7size_of17hc5e3caf4d8826b98E(), !dbg !144 br label %bb1, !dbg !144
  3. 为内部搜索功能正在这里所说的。 (在这种情况下_ZN4core3mem7size_of17hc5e3caf4d8826b98E)。它看起来是这样的: ; core::mem::size_of ; Function Attrs: inlinehint uwtable define internal i64 @_ZN4core3mem7size_of17hc5e3caf4d8826b98E() unnamed_addr #1 !dbg !67 { start: %tmp_ret = alloca i64, align 8 store i64 40, i64* %tmp_ret, align 8, !dbg !87 %0 = load i64, i64* %tmp_ret, align 8, !dbg !87 br label %bb1, !dbg !87
  4. 这是最重要的一点:store i64 40。该结构是40个字节!
  5. 自动化的过程!
  6. 等到整个过程神秘打破。
© www.soinside.com 2019 - 2024. All rights reserved.