C语言中一种流行的基于宏的矢量通用实现(https://github.com/eteran/c-vector/blob/master/vector.h)使用以下内存布局。
+------+----------+---------+
| size | capacity | data... |
+------+----------+---------+
^
| user's pointer
Run Code Online (Sandbox Code Playgroud)
这提供了一个非常方便的API,用户可以通过简单地声明所需类型的指针来获取向量。
float *vf = NULL;
VEC_PUSH_BACK(vf, 3.0);
int *vi = NULL;
size_t sz = VEC_CAPACITY(vi);
Run Code Online (Sandbox Code Playgroud)
在内部,库可以像这样访问大小和容量
#define VEC_CAPACITY(vec) \
((vec) ? ((size_t *)(vec))[-1] : (size_t)0)
Run Code Online (Sandbox Code Playgroud)
但这不是对严格混叠的侵犯吗?
我有一个项目,我使用NSLocalizedString键设置本地化而不是文本参数的实际值,即这样的事情:
NSLocalizedString("RunningDistance", "distance for a marathon")
而不是这个:
NSLocalizedString("Running distance.", "distance for a marathon")
然后,我将它们导出xliff进行翻译并导回; 它一切正常.现在,我想添加新的字符串(以及很多字符串).
我读到目前不建议(并支持)使用genstringsswift.我以为我应该将开发语言导出到xliff,添加翻译和重新导入.我试过这个,我得到了The XLIFF file does not contain a target language错误.
这是否意味着我需要手动将所有这些字符串添加到Localizable.strings其他地方(因为我使用基本本地化)?
有没有其他方法来完成这项工作,并导入我的基本语言xliff?
我有一个Foo带有函数指针的 C 结构。在我的 Rust 绑定中,我希望允许用户设置此函数指针,但我希望避免用户必须处理 FFI 类型。
foo.h
struct Foo {
void* internal;
uint8_t a;
void (*cb_mutate_a)(void*);
};
struct Foo* foo_new();
void foo_free(struct Foo* foo);
void foo_call(struct Foo* foo);
Run Code Online (Sandbox Code Playgroud)
foo.c
struct Foo* foo_new() {
return calloc(1, sizeof(struct Foo));
}
void foo_free(struct Foo* foo) {
free(foo);
}
void foo_call(struct Foo* foo) {
return foo->cb_mutate_a(foo->internal);
}
Run Code Online (Sandbox Code Playgroud)
我当前的解决方案是创建一个 Rust 结构体Bar,它有一个指向 bindgen 生成的 C struct 的指针foo_sys::Foo,并且在其中我有一个特征对象 ( rust_cb),它是我想在 Rust API 中公开的实际回调。我将 C 设置cb为指向 awrapped_cb …