关于宏中#符号非常规用法及cnpy::npz_t下标访问的技术问询
问题解答
1. 宏里#field的作用:预处理器字符串化
C/C++预处理器的#是字符串化运算符,说白了就是把你传给宏的参数直接变成带双引号的字符串。
比如你写SET_ARRAY(struct_member_name, float),预处理器会把它展开成:
foo.struct_member_name = bar["struct_member_name"].data<float>();
这里#field只是把参数struct_member_name转成了字符串"struct_member_name",和结构体成员的内存偏移半毛钱关系都没有——就是借结构体成员的名字当npz文件里的键用。
2. bar["struct_member_name"]怎么拿数据
cnpy::npz_t是cnpy库用来存npz文件内容的容器,其实就是个键值对集合(内部一般用std::unordered_map<std::string, cnpy::NpyArray>实现):
- npz文件本身是多个npy文件的压缩包,每个npy文件都有自己的名字(也就是键);
bar["xxx"]就是用字符串"xxx"当钥匙,去npz包里找同名的npy数据块,找到后返回一个cnpy::NpyArray对象;- 再调用这个对象的
data<type>()方法,就能拿到对应类型的原始数据指针(比如float*或者int*),刚好能直接赋值给foo的结构体成员(因为foo的成员就是指针类型)。
总结下:这个宏就是蹭结构体成员的名字当键,去npz包里捞同名的npy数据,然后把数据指针挂到结构体成员上,完全没用到结构体成员的内存偏移计算。
内容的提问来源于stack exchange,提问作者rallen911
相关产品推荐
相关产品推荐

