相关疑难解决方法(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万
查看次数

为什么没有std :: is_struct类型特征?

我已经看到,为了检查类型T是否是我可以使用的类:

bool isClass = std::is_class<T>::value;
Run Code Online (Sandbox Code Playgroud)

它对类和结构都返回true.我知道在C++中它们几乎是一样的,但我想知道为什么在类型特征中它们之间没有区别.检查这种差异总是没用,还是有一些我不理解的理由?

c++ type-traits c++11

56
推荐指数
5
解决办法
9478
查看次数

为什么新的C++标准使用"ISO/IEC 14882:2015"?

根据ISO网站,新标准被命名为"ISO/IEC 14882:2015 "而不是"ISO/IEC 14882:2014 ".为什么会如此,这会改变吗?例如,有许多标记为C++ 14的东西.

如果你有兴趣在技术含量,而不是标准的文件,它可以从github上ISO C++库N4140.

c++ iso c++14

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

任何人都可以解释为什么size_t类型与一个例子一起使用?

我想知道为什么size_t在我可以使用say int类型的地方使用它.它说这size_t是一种返回类型的sizeof运算符.这是什么意思?就像我使用sizeof(int)并存储它返回int类型变量的内容一样,它也可以工作,没有必要将它存储在一个size_t类型变量中.我只是清楚地想要了解使用的基本概念以及size_t一个明显可以理解的例子.谢谢

c c++

7
推荐指数
2
解决办法
4950
查看次数

定义具有不确定大小的数组

据我了解,当我们定义像const char argv[SIZE];"SIZE" 这样的数组时,必须是编译时已知的数字.

但最近我读了AOSP代码,发现了这个:http://androidxref.com/5.1.1_r6/xref/system/netd/server/NetdConstants.cpp#70

static int execIptables(IptablesTarget target, bool silent, va_list args) {
    /* Read arguments from incoming va_list; we expect the list to be NULL terminated. */
    std::list<const char*> argsList;
    argsList.push_back(NULL);
    const char* arg;
    do {
        arg = va_arg(args, const char *);
        argsList.push_back(arg);
    } while (arg);

    int i = 0;
    const char* argv[argsList.size()];
    ...
Run Code Online (Sandbox Code Playgroud)

似乎const char* argv[argsList.size()];使用仅在运行时已知的大小.这是因为这个数组是在一个函数中定义的,它会在堆栈中分配数组,还是因为编译器可以在编译时找出大小是多少?

c++ arrays

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

C++ 11是否支持C11的新功能?

我最近在C11中进行了探索,许多新功能使我更容易使用C代码.我想知道C++ 11正式支持所有这些功能.我关心的不是实现或编译器问题,而是新的C++标准.

c c++ c++11 c11

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

int [n] [m],其中n和m在运行时是已知的

我经常需要在编译时创建一个宽度和高度(让它们是n和m)未知的2D数组,通常我会写:

vector<int> arr(n * m);
Run Code Online (Sandbox Code Playgroud)

我手动访问元素:

arr[j * m + i] 
Run Code Online (Sandbox Code Playgroud)

我最近被告知我可以改为写:

int arr[n][m] // n and m still only known at runtime.
Run Code Online (Sandbox Code Playgroud)

所以这里有两个问题:

  1. C++标准是否允许这种行为?
  2. 我应该如何将这样的数组传递给函数?g ++报告arr具有类型int (*)[n],但同样,n是动态的,并且在声明它的函数之外不知道(main).

c++ arrays multidimensional-array dynamic-arrays

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

关于堆栈上的动态数组的C++

据我所知,C++/C不支持堆栈上的动态数组.在以下说明中:

int data[n] ; // if the n is not decided at compiling time ,this leads to error
Run Code Online (Sandbox Code Playgroud)

但最近,我读了一些其他人的代码如下:

//**
It seems the n number can not be decided at compling time,but when I run it , if i fprintf the formation, each time i got the correct array size !!!!!!
the G++ version is 4.7.1 
Is this because the G++ 4.7.1 support C++11 x which allow dynamic array?
 **//

#include <cstdio>
#include <algorithm>
using namespace std;

#include <stdio.h>

char …
Run Code Online (Sandbox Code Playgroud)

c++ arrays dynamic

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

根据C++规则是合法的吗?

可能重复:
在C++书籍中,数组绑定必须是常量表达式,但为什么以下代码有效?

看到这段代码

#include<iostream>
int main
{
using namespace std;
int a=7;
char arr[a];
return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的书中写道,array_size必须是一个常量但是代码块没有给出错误...

它不是唯一的例子......还有其他一些例子.

谁是错误的IDE,编译器或任何其他的东西???

使用较新或较旧的书会导致这样的问题?

c++ arrays

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

在C ++中用用户输入初始化数组大小的不同方法是什么

我想知道在c ++中执行以下代码段的一些替代方法。

int i;
cin >> i;
int arr[i];
Run Code Online (Sandbox Code Playgroud)

我最近开始研究竞争性编程并尝试学习更多。

编辑:对于那些不是cpp的评论。它使用我正在使用的类中正在使用的makefile成功编译,gcc -std=c++11 -o a.exe main.cpp并在输入长度为1时返回到控制台

array length: 1
Run Code Online (Sandbox Code Playgroud)

c++ arrays gcc stl c++11

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

C ++ 17是基于C17的吗?

我注意到C ++ 17中的许多新功能来自C17。两种标准之间有关系吗?C函数和它们的C ++等效项之间是否有实际区别?

c c++ language-lawyer c++17 c17

-1
推荐指数
2
解决办法
309
查看次数