0

我有一个非常奇怪的问题,试图运行这个使用zmqmsgpack的非常简单的C 程序

没有问题server.c,但是clinet.c:39有这个msgpack_pack_int (&mpkg, i);,并且 的值i似乎被拾取为0并且在每次迭代中都不会改变。我尝试了很多不同的事情(例如,创建一个指向 i并使用它的指针,还尝试将其拆分为一个函数等),但似乎没有任何帮助。我可以看到这msgpack_pack_int()是一个宏,但为什么它会引入这种行为,我能做些什么来克服它?是否有一个标志可以改变这种宏的行为(因为我看到它扩展为内联函数)......我已经尝试过-Werror -Wall,使用gccand clang,也没有任何警告出现;(*

我尝试调试它并按i预期递增。

我什至试过这个,无论如何它都会做同样的事情:

void pack (msgpack_packer *p, msgpack_sbuffer *b) {

   static volatile int i = 0;

   printf("\ni=%d\n", i);
   msgpack_packer_init (p, b, msgpack_sbuffer_write);
   msgpack_pack_array (p, 2);
   msgpack_pack_int (p, i++);
   msgpack_pack_str (p, "/i/am/a/clinet/");

}

我什至尝试过一些本应不同的东西,但这里也没有运气 -

int count (void) {
    static int i = 0;
    i += 1; return i;
}

谁能明白为什么会这样?

更新 1:我还重新编译了 msgpack 库本身,没有优化标志,这也没有改变行为。

更新 2:从 git repo 安装了 msgpack,我仍然遇到同样的问题。

4

1 回答 1

0

事实证明,在每次迭代中,我都在这样做:

 msgpack_packer_init (&mpkg, &sbuf, msgpack_sbuffer_write);

这只需要做一次,而这应该在那里:

 msgpack_sbuffer_init (&sbuf);

或者:

 msgpack_sbuffer_clear (&sbuf);

将函数放在一起是相当合乎逻辑的msg_pack*,实际上这是从简单的示例中得出的,问题确实出在文档上,额外的评论会有所帮助!

更新:工作版本没有 memcpy的版本。

于 2011-09-17T10:32:13.343 回答