我正在查看 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;
}
}
其次,看看这个:
{
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);
}
}
在我看来,如果 AMQP_RESPONSE_NORMAL != res.reply_type,while 循环应该中断。然而,事实并非如此。 break 语句就像一个“continue”语句。显然,使用“继续”是行不通的。同样,我不确定为什么,因为据我所知,中断会导致退出 while 循环。
最佳答案
大括号引入复合语句和新的内部作用域。
如果您在复合语句中定义变量,则它们仅在该复合语句中可见(在最内层的封闭 {
和 }
之间),并且至少在原则上,当该复合语句未执行时不存在。
此外,在 C99 之前,C 不允许混合声明和语句。每个 block (包括函数的最外层 block )必须包含一系列零个或多个声明,后跟零个或多个语句。创建一个新的内部 block 是一种允许在函数中间引入新变量(其初始值可能取决于函数中先前的计算)的方法。该方面不再是必需的,但 (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
/* ... */
}
删除它们应该没有效果。如果在左外括号和 while (1)
之间有声明,它们可能会有用。也许在早期版本的代码中有,或者作者可能希望稍后添加一些内容。外牙套无害但无用。
由于该项目是使用 git 维护的,我们可以查看该文件的先前版本。以前版本的 examples/amqp_listen.c
在 block 的顶部有几个声明,在 while (1)
之前。在当前版本中,这些声明已被删除(并且在 while
循环本身的顶部添加了一些声明,但不是相同的声明。)
在维护软件时很容易发生这种小故障;恕我直言,这没什么大不了的。
至于你问题的第二部分,我不知道你为什么说 break
不会终止循环。难道是干脆又进入了循环? (如果不研究其余代码,我无法判断。)
关于c++ - 关于rabbitmq-c中使用的C语法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21194435/