小编nad*_*ada的帖子

一次性写“ if”的最优雅方式

由于C ++ 17可以编写一个if块,因此将完全执行一次,如下所示:

#include <iostream>
int main() {
    for (unsigned i = 0; i < 10; ++i) {

        if (static bool do_once = true; do_once) { // Enter only once
            std::cout << "hello one-shot" << std::endl;
            // Possibly much more code
            do_once = false;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可能对此有过多的思考,还有其他方法可以解决此问题,但是仍然-是否可以以这种方式编写此文本,因此do_once = false最后不需要?

if (DO_ONCE) {
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

我在考虑一个辅助函数,do_once()其中包含static bool do_once,但是如果我想在不同的地方使用相同的函数呢?可能这是时间和地点#define吗?我希望不是。

c++ if-statement c++17

134
推荐指数
8
解决办法
2万
查看次数

为什么C#列表由signed int索引

我是C#的新手,我有一些C++和C的背景,这就是为什么我没有理解,为什么Lists <>被索引int而不是像一些无符号整数uint.这是非常不合逻辑的,因为不能有一个元素,即-1左右.

当以下代码无法运行时,会出现这种情况:

List<string> some_list = new List<string>();
/* Insert some strings */

for (uint i = 0; i < some_list.Count; ++i) {
    string element = some_lists[i]; // Error: No possible conversion from uint to int
    /* do something with string_element */
}
Run Code Online (Sandbox Code Playgroud)

在C++中,这会给我一个编译器警告,但仍然编译正常.那么C#在列表中使用有符号整数作为索引的原因是什么?这对我来说看起来不是很尖锐,但也许有人可以启发我.

c# list

7
推荐指数
0
解决办法
95
查看次数

可以访问边界外部的数组元素破坏它

是否有可能访问其边界之外的数组破坏其现有元素

MyObject* array[10];

for(int i=0; i<10; i++)
{
    array[i] = nullptr;
}
array[1] = new MyObject();
array[8] = new MyObject();
array[15] = new MyObject();
Run Code Online (Sandbox Code Playgroud)

可能会访问array [15]导致0-10之间的元素损坏?

c++ arrays undefined-behavior

5
推荐指数
1
解决办法
128
查看次数

在任何情况下, switch 语句中的 using 声明是否合法?

以下代码在 GCC 9.1 (-Wall -Wextra -Werror -g) 中编译良好,没有任何警告或错误,但 clang-tidy 给了我 OCDFAInspection warning: unreachable code. 由于 GCC 具有所有这些插件,例如开关案例中的整数范围,因此我担心这可能是另一个插件,而不是真正有效的 C++。

那么下面的代码在 C++ 中合法吗(如果重要的话是 17)?

namespace foo {
    void bar() {}
}

int main() {
    int n = 42;

    switch (n) {
        using namespace foo; // <- is this valid?
        case 42: 
            bar();
            break;
        default: 
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ switch-statement

4
推荐指数
1
解决办法
141
查看次数

为什么这么多库定义自己的固定宽度整数?

至少从 C++11 开始,我们就得到了可爱的固定宽度整数,例如在 C++<cstdint><stdint.h>开箱即用的 C 中(例如std::uint32_t, ),因此无论 前面std::int8_t有或没有,甚至作为最小宽度的宏( 、和很快)。std::INT16_CUINT32_C

然而,我们每天都会与库打交道,它们定义了自己的固定宽度整数,您可能已经看到过,例如,,,,,,sf::Int32……quint32如果boost::uint32_t您愿意,我可以继续说下去。你可能也认识几个。Ogre::uint32ImS32

有时,这些 typedef(通常也是宏定义)可能会导致冲突,例如,当您想要将std固定宽度整数传递给库中的函数时,期望宽度完全相同但定义不同的固定宽度整数。

固定宽度整数的要点是它们具有固定的大小,正如您所知,这正是我们在许多情况下所需要的。那么为什么所有这些库都会使用和 typedef 与我们在 C++ 标准中已有的整数完全相同的整数呢?这些额外的定义有时会令人困惑、多余,并且可能会侵入您的代码库,这是非常糟糕的事情。如果他们没有承诺拥有的宽度和符号,他们至少违反了最少惊讶的原则,所以我特此问你他们的观点是什么?

c++ integer fixed-width

1
推荐指数
1
解决办法
540
查看次数

将uint64_t Bitmask转换为bool的std :: array

目标是将a std::uint64_t(用作位掩码)转换为a std::array<bool>.

这个问题类似于C#问题如何将int转换为bool数组?,但对于C++而言,我正在寻找具有最佳性能的算法.

给定a std::uint64_t,用作位掩码,我知道可以按位循环遍历其内容,并将bitcompare值设置为位于相同位置的值std::array<bool>.

但是在全能的C++ 必须有一种更有效的方式!也许一些肮脏的演员,mallocs或诸如此类的东西?一切都好; 我在Windows/GCC上,所以即使是仅GCC功能也是完全允许的.

c++ arrays performance gcc stdarray

0
推荐指数
1
解决办法
115
查看次数

获得C样式数组长度的更好方法是什么?

这些天,我正在阅读C ++入门。该书说,要获得C样式数组的长度,可以使用函数std :: begin和std :: end获得两个指针并将其相减。但是,我知道sizeof(a)/sizeof(a[0])如果aC型数组也可以使用。那么哪种方法更好,或者它们之间没有什么区别呢?

c++ c++11

0
推荐指数
1
解决办法
102
查看次数