相关疑难解决方法(0)

为什么变长数组不是C++标准的一部分?

在过去的几年里,我并没有非常使用过C语言.当我今天读到这个问题时,我遇到了一些我不熟悉的C语法.

显然在C99中,以下语法有效:

void foo(int n) {
    int values[n]; //Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一个非常有用的功能.有没有关于将它添加到C++标准的讨论,如果是这样,为什么它被省略?

一些潜在的原因:

  • 毛茸茸的编译器供应商实现
  • 与标准的其他部分不兼容
  • 可以使用其他C++构造模拟功能

C++标准规定数组大小必须是常量表达式(8.3.4.1).

是的,当然我意识到在玩具示例中可以使用std::vector<int> values(m);,但这会从堆中分配内存而不是堆栈.如果我想要一个多维数组,如:

void foo(int x, int y, int z) {
    int values[x][y][z]; // Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)

vector版本变得很笨拙:

void foo(int x, int y, int z) {
    vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
Run Code Online (Sandbox Code Playgroud)

切片,行和列也可能遍布整个内存.

看一下comp.std.c++这个问题的讨论很明显,这个问题在争论的两个方面都有一些非常重要的名字引起争议.毫无疑问,a std::vector总是更好的解决方案.

c++ arrays standards variable-length variable-length-array

311
推荐指数
7
解决办法
14万
查看次数

在GCC/G ++编译器中使用-pedantic的目的是什么?

这张便条说:

-ansi:告诉编译器实现ANSI语言选项.这会关闭GCC的某些与ANSI标准不兼容的"功能".

-pedantic:与-ansi此结合使用,这告诉编译器严格遵守ANSI标准,拒绝任何不符合的代码.

首先要做的事情:

  • GCC/G ++编译器的选项-pedantic-ansi选项的目的是什么(我无法理解上面的描述)?
  • 谁能告诉我使用这两个选项的合适情况?
  • 我应该什么时候使用它们?
  • 它们重要吗?

c c++ gcc g++

127
推荐指数
6
解决办法
10万
查看次数

"int size = 10;" 产生一个恒定的表达?

以下代码在gcc 4.8和Clang 3.2下编译:

int main()
{
  int size = 10;
  int arr[size];
}
Run Code Online (Sandbox Code Playgroud)

C++标准的8.3.4/1表示数组的大小必须是一个整数常量表达式,这size似乎不是.这是两个编译器中的错误,还是我错过了什么?

最新的VC++ CTP用这个有趣的消息拒绝代码:

error C2466: cannot allocate an array of constant size 0
Run Code Online (Sandbox Code Playgroud)

有趣的是,它似乎认为size是零.但至少它拒绝了代码.gcc和Clang应该不一样吗?

c++ arrays compile-time-constant variable-length-array c++11

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