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

标签 c++ c while-loop rabbitmq break

我正在查看 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/

相关文章:

c++ - 这段代码会做什么? (内存管理)

c++ - 关于C++中的pow函数

c - 大小为 1 的数组与指向结构的指针

c++ - CIN 回路不工作

java - Java 中的 while 循环不会对文档的最后一行执行操作

c++ - 为什么 std::forward 不能自己推导模板参数?

c++ - 删除 "fixed"流操纵器时出现问题

c - C 中的文件描述符分配

可以对两种结构类型之一进行操作的 C 函数

javascript - 我似乎无法使用 while 循环来处理我的代码