Мне в первую очередь интересны мнения.
Начнем с того, что я весьма уважаю компилятор с++ в gcc и подобного (см. ниже) поведения от него я неожидал вовсе. Цель моего поста выяснить кто неправ. И если неправ я, то почему.
Есть такой код (скажу сразу, я бы в жизни не додумался написать такое, однако, есть добрые люди, посдказали

:
int main(int argc, char * argv[])
{
int arr[argc]; // что это мы тут такое творим!??
return 0;
}
Mingw v3.4.2, проглотил этот код без каких-либо предупреждений, даже при выставленной опции компиляции -Wall.
Он скомпилировал и такой код:
int main(int argc, char * argv[])
{
const int size = argc;
int a[size];
return 0;
}
Потом я стал экспериментировать и написал вот что:
int f(int a)
{
return a;
}
int main(int argc, char * argv[])
{
int size;
std::cin >> size;
const int b = f(size);
std::cout << b << std::endl; // b будет равно тому, что мы записали в size
int a[b];
return 0;
}
Может конечно в этом коде заключен какой-то скрытый смысл, коего я непонимаю. Но мне кажется, что это все неверно и компилироваться не должно. Это подтвердили тесты на других компиляторах и просмотр стандарта ISO/IEC 14882 за 98 год...
У кого какие мнения на сей счет?
Здравствуйте, _nn_, Вы писали:
__>Возможно это расширение GCC.
Ты прав.
Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C89 mode and in C++. (However, GCC's implementation of variable-length arrays does not yet conform in detail to the ISO C99 standard.) These arrays are declared like any other automatic arrays, but with a length that is not a constant expression. The storage is allocated at the point of declaration and deallocated when the brace-level is exited. For example:
FILE *
concat_fopen (char *s1, char *s2, char *mode)
{
char str[strlen (s1) + strlen (s2) + 1];
strcpy (str, s1);
strcat (str, s2);
return fopen (str, mode);
}
отсюда
http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_5.html
Здравствуйте, Dr.Offset, Вы писали:
DO>Мне в первую очередь интересны мнения.
DO>Начнем с того, что я весьма уважаю компилятор с++ в gcc и подобного (см. ниже) поведения от него я неожидал вовсе. Цель моего поста выяснить кто неправ. И если неправ я, то почему.
DO>Есть такой код (скажу сразу, я бы в жизни не додумался написать такое, однако, есть добрые люди, посдказали
:
DO>У кого какие мнения на сей счет?
выделение памяти под такой массив может проводиться также, как если бы вы написали
char *a = alloca(size);
т.е. выделяется из стека нужный объем.
это только один вариант, не исключено счто компилятор это место реализует по другому