在过去的几年里,我并没有非常使用过C语言.当我今天读到这个问题时,我遇到了一些我不熟悉的C语法.
显然在C99中,以下语法有效:
void foo(int n) {
int values[n]; //Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个非常有用的功能.有没有关于将它添加到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总是更好的解决方案.
我已经看到,为了检查类型T是否是我可以使用的类:
bool isClass = std::is_class<T>::value;
Run Code Online (Sandbox Code Playgroud)
它对类和结构都返回true.我知道在C++中它们几乎是一样的,但我想知道为什么在类型特征中它们之间没有区别.检查这种差异总是没用,还是有一些我不理解的理由?
根据ISO网站,新标准被命名为"ISO/IEC 14882:2015 "而不是"ISO/IEC 14882:2014 ".为什么会如此,这会改变吗?例如,有许多标记为C++ 14的东西.
我想知道为什么size_t在我可以使用say int类型的地方使用它.它说这size_t是一种返回类型的sizeof运算符.这是什么意思?就像我使用sizeof(int)并存储它返回int类型变量的内容一样,它也可以工作,没有必要将它存储在一个size_t类型变量中.我只是清楚地想要了解使用的基本概念以及size_t一个明显可以理解的例子.谢谢
据我了解,当我们定义像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()];使用仅在运行时已知的大小.这是因为这个数组是在一个函数中定义的,它会在堆栈中分配数组,还是因为编译器可以在编译时找出大小是多少?
我最近在C11中进行了探索,许多新功能使我更容易使用C代码.我想知道C++ 11正式支持所有这些功能.我关心的不是实现或编译器问题,而是新的C++标准.
我经常需要在编译时创建一个宽度和高度(让它们是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)
所以这里有两个问题:
int (*)[n],但同样,n是动态的,并且在声明它的函数之外不知道(main).据我所知,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) 看到这段代码
#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 ++中执行以下代码段的一些替代方法。
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 ++ 17中的许多新功能来自C17。两种标准之间有关系吗?C函数和它们的C ++等效项之间是否有实际区别?