我有一个非常奇怪的问题,试图运行这个非常简单的C program,它使用的是 zmq 和 msgpack 。
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,我仍然遇到同样的问题。
答案 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 的