传递给`msgpack_pack_int()`宏的计数器变量不会递增

时间:2011-09-16 18:07:43

标签: c zeromq msgpack

我有一个非常奇怪的问题,试图运行这个非常简单的C program,它使用的是 zmq msgpack

server.c没有问题,但在clinet.c:39 这是msgpack_pack_int (&mpkg, i);,而 i 的值似乎是 被选为0并且在每次迭代时都不会改变。一世 我尝试了很多不同的东西(比如制作指针) i 并使用它,也尝试将其拆分为函数等) 似乎没有任何帮助。我可以看到msgpack_pack_int()是 一个宏,但为什么它会引入这样的行为,什么可以 我想克服它吗?是否有可以改变行为的旗帜 这种宏(我认为它扩展为内联函数)... 我尝试了-Werror -Wallgccclang,没有 警告也出现了;(*

我尝试调试它, 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,我仍然遇到同样的问题。

1 个答案:

答案 0 :(得分:0)

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

 msgpack_packer_init (&mpkg, &sbuf, msgpack_sbuffer_write);

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

 msgpack_sbuffer_init (&sbuf);

或:

 msgpack_sbuffer_clear (&sbuf);

msg_pack*函数放在一起确实是合乎逻辑的 这取自simple example和。{ 问题实际上是文档,一个额外的评论会有所帮助!

更新:working version& version without memcpy