gpt4 book ai didi

c++ - Boost::asio 这种奇怪的编码风格是什么?

转载 作者:可可西里 更新时间:2023-11-01 17:39:32 25 4
gpt4 key购买 nike

我正准备在我的 boost asio 套接字通信中调试一些东西。并在 asio 库中找到了这段代码(在 boost/asio/impl/write.hpp 第 169 行(boost 1.47)中找到):

  switch (start)
{
case 1:
buffers_.prepare(this->check_for_completion(ec, total_transferred_));
for (;;)
{
stream_.async_write_some(buffers_,
BOOST_ASIO_MOVE_CAST(write_op)(*this));
return;
default:
total_transferred_ += bytes_transferred;
buffers_.consume(bytes_transferred);
buffers_.prepare(this->check_for_completion(ec, total_transferred_));
if ((!ec && bytes_transferred == 0)
|| buffers_.begin() == buffers_.end())
break;
}

handler_(ec, static_cast<const std::size_t&>(total_transferred_));
}

我已经有多年的 C/C++ 开发经验,但我一生中从未见过如此奇怪的实现。看那里, switch 语句的 default: 标签在 for 循环内。

如果我理解正确,那么 switch 语句被“误用”而不是 goto,对吧(对于 start != 1 的情况,goto default:)?就标准而言,它实际上是有效的 C/C++ 吗?例如,如果我放

会发生什么
for(int i=0; i < 10; i++)

代替原来代码中的for循环。如果执行跳转到默认:标签,“i”是否会未定义?当然,我可能会在这里使用调试器,但这对我来说似乎很可疑,我认为这可能会为不同的编译器产生不同的行为。

最佳答案

这是定义明确的有效代码。 switch 实际上是一个美化的 goto。要巧妙地使用此构造,请查看 Duff's device .

至于您的for,那是不合法的。跳转到 case 标签不能跨越初始化。

关于c++ - Boost::asio 这种奇怪的编码风格是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8064057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com