我有一个奇怪的问题,试图运行使用zmq和msgpack的这个非常简单的C program。server.c
没有问题,但是在clinet.c:39
中
是msgpack_pack_int (&mpkg, i);
且i
的值似乎
以0
的形式拾取,并且在每次迭代时都不会更改。一世
尝试了很多不同的事情(例如,指向i
并使用它,还尝试将其拆分为一个函数等)
似乎没有任何帮助。我可以看到msgpack_pack_int()
是
宏,但是为什么会引入这种行为,以及
我要克服吗?是否有可能改变行为的标志
这种宏(如我所见,扩展为内联函数)...
我已经尝试过-Werror -Wall
,gcc
和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,我仍然遇到相同的问题。
最佳答案
事实证明,在每次迭代中我都这样做:
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。
关于c - 传递给`msgpack_pack_int()`宏的计数器变量不会增加,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7448693/