由于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#的新手,我有一些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#在列表中使用有符号整数作为索引的原因是什么?这对我来说看起来不是很尖锐,但也许有人可以启发我.
是否有可能访问其边界之外的数组破坏其现有元素
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之间的元素损坏?
以下代码在 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++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++ 标准中已有的整数完全相同的整数呢?这些额外的定义有时会令人困惑、多余,并且可能会侵入您的代码库,这是非常糟糕的事情。如果他们没有承诺拥有的宽度和符号,他们至少违反了最少惊讶的原则,所以我特此问你他们的观点是什么?
目标是将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 ++入门。该书说,要获得C样式数组的长度,可以使用函数std :: begin和std :: end获得两个指针并将其相减。但是,我知道sizeof(a)/sizeof(a[0])如果aC型数组也可以使用。那么哪种方法更好,或者它们之间没有什么区别呢?
c++ ×6
arrays ×2
c# ×1
c++11 ×1
c++17 ×1
fixed-width ×1
gcc ×1
if-statement ×1
integer ×1
list ×1
performance ×1
stdarray ×1