我即将在我的boost asio socket通信中调试一些东西.并在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_));
}
Run Code Online (Sandbox Code Playgroud)
我已经有很多年的C/C++开发经验,但在我的生活中从来没有见过这种奇怪的实现.在那里,switch语句的默认:标签在for循环中.
如果我理解这一点,那么switch语句是"误用"而不是goto,对(对于start!= 1,goto default :)的情况?它实际上是一个有效的C/C++标准吗?如果我举例说明会发生什么
for(int i=0; i < 10; i++)
Run Code Online (Sandbox Code Playgroud)
而不是原始代码中的for循环.如果跳转执行到默认值,"i"是否会被定义:标签?当然,我可能会在这里使用调试器,但这对我来说似乎很可疑,我认为这可能会为不同的编译器产生不同的行为.
我对使用git的子模块功能感到非常沮丧.要么我仍然没有做对,要么就是因为我没想到这一点.以下项目情况给出:
Project
| .git
| projsrc
| source (submodule)
| proj.sln
Run Code Online (Sandbox Code Playgroud)
在此方案中,源指向包含所有项目中的公共源数据的另一个存储库.在源代码下发生了很多开发,也在projsrc下.遗憾的是,Project指向源子模块的一些提交,而不是它的实际HEAD.这是通常的git行为,据我所知.
我已经发现了
git submodule update
Run Code Online (Sandbox Code Playgroud)
只需获取与主项目一起提交的子模块版本.但是,我真的希望始终与子模块开发保持同步,但是没有任何真正的线索如何做到这一点.因此我的问题是:
是否可以将项目附加到子模块的HEAD,不管这是否会破坏项目的编译.我只是不想总是进入子模块目录并执行git pull.因为我认为我可以放弃在子模块目录中完成的更改,因为这很简单地附加到提交而不是真正的任何分支左右.
请考虑以下限制: