gpt4 book ai didi

c++ - 在函数内部使用裸括号是一种好习惯吗?

转载 作者:太空狗 更新时间:2023-10-29 21:15:28 24 4
gpt4 key购买 nike

从技术上讲,在 C++ 中我们可以使用花括号来声明一个新的作用域。例如在这个函数中,它交换两个数字

void swap_int(int& first, int& second)
{
int temp = first;
first = second;
second = temp;
}

我们也可以在它自己的 block 中声明 temp:

void swap_int(int& first, int& second)
{
// Do stuf...
{
int temp = first;
first = second;
second = temp;
}
// Do other stuff...
}

这显然有一个好处,当不再需要时,直接删除temp

但是,在我编写的代码中我从不使用它。此外,在来自 3rd 方库的代码中,我几乎从未见过它。

为什么不公开使用?它会带来任何性能提升,还是仅仅意味着额外的打字工作?

最佳答案

本身我没有看到任何带有裸括号的错误。它们是语言的一部分,并且定义明确。从历史上看,我发现它们有用的一个地方是在处理使用状态代码而不是异常的代码时,同时保持 const goodness:

const StatusCode statusCode = DoThing();
if (statusCode == STATUS_SUCCESS)
Foo();
else
Bar();

const StatusCode statusCode2 = DoAnotherThing(); // Eww variable name.
...

替代方案是:

{
const StatusCode statusCode = DoThing();
if (statusCode == STATUS_SUCCESS)
Foo();
else
Bar();
}

{
// Same variable name, used for same purpose, easy to
// find/replace, and has const guarantees. Great success.
const StatusCode statusCode = DoAnotherThing();
...
}

这同样适用于使用 RAII 的线程锁等对象(互斥对象、信号量等),或者通常您可能希望生命周期极短的任何类型的资源(例如文件句柄)。

就我个人而言,我认为它很少见的原因是它可能表示代码有异味(尽管并非总是如此)。在有裸括号的地方,可能有机会分解出一个函数。

以您的示例为例,如果 swap_int 有不止一项工作,那么该函数会做不止一件事。通过将实际交换代码提取到另一个函数中,您可以鼓励重用!例如:

template <typename T>
void swap_anything(T &first, T& second)
{
T temp = first;
first = second;
second = temp;
}

// -------------------------------------------

void swap_int(int& first, int& second)
{
// Do stuff...
swap_anything(first, second);

// Do other stuff...
}

关于c++ - 在函数内部使用裸括号是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37633074/

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