【问题标题】:Counter variable passed to `msgpack_pack_int()` macro doesn't increment传递给“msgpack_pack_int()”宏的计数器变量不递增
【发布时间】:2011-09-16 18:07:42
【问题描述】:

我在尝试运行这个非常简单的C program 时遇到了一个非常奇怪的问题,它使用 zmqmsgpack

server.c 没有问题,但是在clinet.c:39 那里 这是msgpack_pack_int (&mpkg, i);i 的值似乎 以0 的形式获取,并且在每次迭代中都不会改变。一世 尝试了很多不同的事情(例如,制作一个指向 i 并使用它,还尝试将其拆分为函数等) 似乎没有任何帮助。我可以看到msgpack_pack_int() 是 一个宏,但是为什么它会引入这样的行为以及什么可以 我要克服它吗?是否有可以改变行为的标志 这种宏(我看到它扩展为内联函数)...... 我试过-Werror -Wall,用gccclang,什么都没有 出现警告;(*

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

【问题讨论】:

标签: c zeromq msgpack


【解决方案1】:

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

 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

【讨论】:

    猜你喜欢
    • 2019-04-05
    • 1970-01-01
    • 2014-10-01
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多