小编Sho*_*med的帖子

(((size_t *)(vec))[-1]是否违反严格混叠?

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)

但这不是对严格混叠的侵犯吗?

c strict-aliasing

12
推荐指数
1
解决办法
176
查看次数

用于更新开发语言的本地化工作流程

我有一个项目,我使用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错误.

  1. 这是否意味着我需要手动将所有这些字符串添加到Localizable.strings其他地方(因为我使用基本本地化)?

  2. 有没有其他方法来完成这项工作,并导入我的基本语言xliff

xcode localization xliff swift

5
推荐指数
0
解决办法
182
查看次数

如何在 Rust 中正确包装 C 函数指针?

我有一个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 …

c ffi rust rust-bindgen

5
推荐指数
1
解决办法
2206
查看次数

标签 统计

c ×2

ffi ×1

localization ×1

rust ×1

rust-bindgen ×1

strict-aliasing ×1

swift ×1

xcode ×1

xliff ×1