Bob*_*Bob 2 c c++ break while-loop rabbitmq
我正在看rabbitmq-c,我注意到以下几点:
首先,我不太了解外括号的用法,例如:
{
amqp_queue_declare_ok_t *r = amqp_queue_declare(conn, 1, amqp_empty_bytes, 0, 0, 0, 1,
amqp_empty_table);
die_on_amqp_error(amqp_get_rpc_reply(conn), "Declaring queue");
queuename = amqp_bytes_malloc_dup(r->queue);
if (queuename.bytes == NULL) {
fprintf(stderr, "Out of memory while copying queue name");
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
其次,看看这个:
{
while (1) {
amqp_rpc_reply_t res;
amqp_envelope_t envelope;
amqp_maybe_release_buffers(conn);
res = amqp_consume_message(conn, &envelope, NULL, 0);
if (AMQP_RESPONSE_NORMAL != res.reply_type) {
break;
}
printf("Delivery %u, exchange %.*s routingkey %.*s\n",
(unsigned) envelope.delivery_tag,
(int) envelope.exchange.len, (char *) envelope.exchange.bytes,
(int) envelope.routing_key.len, (char *) envelope.routing_key.bytes);
if (envelope.message.properties._flags & AMQP_BASIC_CONTENT_TYPE_FLAG) {
printf("Content-type: %.*s\n",
(int) envelope.message.properties.content_type.len,
(char *) envelope.message.properties.content_type.bytes);
}
amqp_destroy_envelope(&envelope);
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,如果AMQP_RESPONSE_NORMAL!= res.reply_type,while循环应该会中断.但事实并非如此.break语句就像一个'continue'语句.显然,使用"继续"是行不通的.同样,我不知道为什么,因为据我所知,休息会导致退出while循环.
大括号引入复合语句和新的内部范围.
如果在复合语句中定义变量,它们只能在该复合语句中(在最里面的封闭{和之间})可见,并且至少原则上,当该复合语句未执行时,它们不存在.
此外,在C99之前,C不允许声明和声明混合使用.每个块(包括函数的最外面的块)必须包含零个更多声明的序列,后跟零个或多个语句.创建新的内部块是一种允许在函数中间引入新变量(其初始值可能取决于函数中的先前计算)的方法.这方面不再是必要的,但是(a)代码可能被设计为可以与C99之前的编译器兼容,并且(b)限制范围可能是一个好主意.
至于break声明,是的,它确实终止while循环 - 在这种情况下,它似乎是封闭while (1)循环可以停止的唯一方式.在之后break;被执行,执行会闭幕后继续}在中while环.一个continue语句将终止循环的当前迭代,并在顶部重新开始.
在快速查看完整源代码后回复您的评论,似乎没有任何理由围绕while循环的外括号.来源概述是:
int main(int argc, char const *const *argv)
{
/* ... */
{ // <-- Opening outer brace
while (1) {
/* ... */
}
} // <-- Closing outer brace
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
删除它们应该没有任何效果.如果开口外支架和开口外支架之间有声明,它们可能很有用while (1).也许在早期版本的代码中,或者作者预计稍后会添加一些内容.外支架无害但无用.
由于项目是使用git维护的,我们可以查看该文件的先前版本.之前的版本examples/amqp_listen.c在块的顶部有几个声明,之前的版本while (1).在当前版本中,删除了那些声明(并且在while循环顶部添加了一些声明,但不是相同的声明.)
随着软件的维护,这种小故障很容易发生; 恕我直言这个并不是什么大不了的事.
至于你问题的第二部分,我不知道为什么你说break不会终止循环.难道只是再次输入循环吗?(如果不研究其余的代码,我无法分辨.)