关于rabbitmq-c中使用的C语法的问题

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循环.

Kei*_*son 6

大括号引入复合语句和新的内部范围.

如果在复合语句中定义变量,它们只能在该复合语句中(在最里面的封闭{和之间})可见,并且至少原则上,当该复合语句未执行时,它们不存在.

此外,在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不会终止循环.难道只是再次输入循环吗?(如果不研究其余的代码,我无法分辨.)