我有一个静态数组初始化了一些常数值:
static PROG_ROM: [u8; 850] = [0x12, 0x1d, ...];
我想在编译时加载文件的内容,听起来像是std::include_bytes!
的工作,但是我有两个问题:
include_bytes!("foo.dat")
的类型是&[u8; 850]
,即它是一个引用。我需要这是一个真正的静态数组。
1.即使有一个include_bytes_static!
宏类型为[u8;850]
,我也必须像这样使用它:
static PROG_ROM: [u8; 850] = include_bytes_static!("foo.dat");
也就是说,我必须硬编码文件的长度。相反,我想从文件内容的长度中提取长度。
因此,我的代码的理想替代品应该是一个宏来替换整个定义,即类似于以下内容:
define_included_bytes!(PROG_ROM, "foo.dat")
它会扩展到
static PROG_ROM: [u8; 850] = [0x12, 0x1d, ...];
我该怎么做呢?
3条答案
按热度按时间p8h8hvxi1#
使用
*include_bytes!(..)
来获取[u8; _]
而不是&[u8; _]
(因为数组实现了Copy
),并使用include_bytes!(..).len()
(这是一个常量方法)来指定类型中数组的长度:v7pvogib2#
正如Chayim Friedman指出的,你可以很容易地自己定义proc宏:
显然,这只是一个拼凑在一起的概念证明,你应该仔细检查令牌,而不是仅仅假设它们是正确的。
yyyllmsg3#
基于cafce25's answer,我最终使用
syn
和quote
编写了以下版本:(别管
link_section
属性,它是AVR-ism)。这样做效果很好,只是Cargo不跟踪外部文件的依赖性,因此如果其内容发生变化,使用
progmem_include_bytes!
的程序不会被cargo build
重新编译。