关于激发我的问题的背景信息:
我了解了 C 中的指定初始值设定项(请参阅here和这里:https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html),这太棒了,并且允许您像这样在 C 中初始化 C 数组,这太棒了:
int my_array[] =
{
[MY_ENUM1] = 7,
[MY_ENUM5] = 6,
};
我在 C++ 中尝试过,但不起作用(看我的评论根据上面链接的答案)。真糟糕。我在 C++ 中尝试过std::vector
并得到了我不理解的行为。这里发生了什么?
我的问题的关键是:
什么是[7] = 12
and [10] = 15
在我的例子中做什么?那里发生了什么事?为什么会这样编译?为什么输出是这样的?
我刚刚编译了下面的代码-Wall -Wextra -Werror -Wpedantic
,并且它仍然以零警告进行编译。-Wpedantic是我几乎从未使用过的,也不推荐,因为它关闭了编译器扩展,我喜欢保留它。然而,我仍然没有收到关于这种不寻常的警告[7] = 12
syntax.
更新:onlinegdb 接受我的编译器标志的能力似乎有问题。和-Wpedantic
当我运行它时我确实看到了警告locally:
eRCaGuy_hello_world/cpp$ g++ -Wall -Wextra -Werror -Wpedantic -O3 -std=c++17 vector_with_square_brackets.cpp -o bin/a && bin/a
vector_with_square_brackets.cpp:19:5: error: ISO C++ does not allow C99 designated initializers [-Werror=pedantic]
[7] = 12, // Why does this "work" here? What is happening?
^
vector_with_square_brackets.cpp:20:5: error: ISO C++ does not allow C99 designated initializers [-Werror=pedantic]
[10] = 15,
^
cc1plus: all warnings being treated as errors
WithOUT -Wpedantic
但是,我没有看到任何警告或错误:
eRCaGuy_hello_world/cpp$ g++ -Wall -Wextra -Werror -O3 -std=c++17 vector_with_square_brackets.cpp -o bin/a && bin/a
1
2
3
12
15
4
...但是输出仍然不遵循指定初始值设定项的规则。我是否遇到了编译器错误之类的问题?我仍然想要更多的答案和清晰度。
My g++ --version
is g++ (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
.
尤其是我在下面的代码中的评论:
在线运行:https://onlinegdb.com/FZ2YdZXJe(gcc 编译器设置为 C++17)
#include <iostream>
#include <vector>
std::vector<int> v =
{
1,
2,
3,
[7] = 12, // Why does this "work" here? What is happening?
[10] = 15,
4,
};
int main()
{
for (int i : v)
{
std::cout << i << "\n";
}
printf("\n");
return 0;
}
Output:
1
2
3
12
15
4
另外,我实际上期望输出看起来像这样,假设它的行为就像 C 数组中的“指定初始值设定项”。由于我没有得到这个输出,所以一定发生了其他我不明白的事情(因此这个问题)。
1
2
3
0
0
0
0
12
0
0
15
4
更新:这似乎是一个 GCC 编译器错误
...它存在于版本 8.4(我正在使用的版本)中,但已被版本 9.1 修复。请参阅此答案下面的评论:
我想说,这是以前版本编译器的普遍问题,因为 GCC 8.4 确实编译了它:https://godbolt.org/z/xqYq6jeb8。从9.1版本开始,错误开始出现。 – 埃尔达尔·库楚克