在过去的几年里,我并没有非常使用过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总是更好的解决方案.
今天编译器支持的C99标准有多普遍?据我所知,即使GCC完全支持它.这是正确的吗?
C99的哪些功能比其他功能更受支持,即我可以使用哪些功能来确定大多数编译器都能理解我?
我正在学习C.我有一个方法,需要3个字符串并将它们组合起来做一些操作.以下是我使用GCC编译器的第一个实现.
void foo(const char *p1, const char *p2, const char *p3)
{
size_t length = strlen(p1) + strlen(p2) + strlen(p3);
char combined[length + 1];
memset(combined, 0, length + 1);
strcat(combined, p1);
strcat(combined, p2);
strcat(combined, p3);
printf("Result : %s", combined);
}
int main()
{
foo("hello ", "world ", "how");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是当我使用编译时cc -Wall -pedantic -g foo.c -o foo,我开始收到类似的警告ISO C90 forbids variable length array ‘combined’.MSVC没有编译此代码.更改了代码
void foo(const char *p1, const char *p2, const char *p3)
{
size_t …Run Code Online (Sandbox Code Playgroud)