Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > gcc vs mvs08 разности при компиляции ?


Автор: Remiznik 26.10.2009, 13:48
Извиняюсь за название темы не знаю как точно назвать !
    Вобшем занимался переносом одного проекта из Linux в Windows. А именно хотел прогнать код через компилятор mvs08. 
    И вот тут столкнулся с такой штукой .
Код

int chn;
short int  buf[ 512*chn ];


Этот код нормально собирается в gcc а вот в msv08 выдаёт ошибку. Как я помню нельзя задавать размер массива переменной и значит msv08 прав. Но почему же тогда gcc собирает нормально ? Или он находя такое определение автоматически переделывает его  динамический массив и сам следит за его удалением после выхода из области видимости ? 

Автор: niXman 26.10.2009, 17:44
Remiznik, MSVC по ходу, не поддерживает С99(http://ru.wikipedia.org/wiki/C99)

Добавлено через 1 минуту и 33 секунды
Цитата(Remiznik @  26.10.2009,  11:48 Найти цитируемый пост)
Но почему же тогда gcc собирает нормально

Потому что поддерживает.

Цитата(Remiznik @  26.10.2009,  11:48 Найти цитируемый пост)
Или он находя такое определение автоматически переделывает его  динамический массив и сам следит за его удалением после выхода из области видимости ?

Вот тут не знаю. Был бы рад если бы кто-то более просвещенный внес ясность.

Автор: Remiznik 26.10.2009, 18:37
Цитата(niXman @ 26.10.2009,  17:44)
Цитата(Remiznik @  26.10.2009,  11:48 Найти цитируемый пост)
Или он находя такое определение автоматически переделывает его  динамический массив и сам следит за его удалением после выхода из области видимости ?

Вот тут не знаю. Был бы рад если бы кто-то более просвещенный внес ясность.

          Это не утверждение это всеголиш моя догадка . Просто я бы удивлён когда mvs08 выдал ошибку . Пришлось импользовать динамические массивы.

Автор: niXman 26.10.2009, 22:38
Цитата(Remiznik @  26.10.2009,  16:37 Найти цитируемый пост)
Просто я бы удивлён когда mvs08

Я уже не удивляюсь. Микрософтовский компилятор вообще не особо следует стандартам  С/С++.
Если для изучения С++ тебе важно соответствие стандарту, то лучше использовать http://www.comeaucomputing.com/ или http://sourceforge.net/projects/mingw/

Автор: 586 28.10.2009, 00:53
Цитата(Remiznik @  26.10.2009,  13:48 Найти цитируемый пост)
Или он находя такое определение автоматически переделывает его  динамический массив и сам следит за его удалением после выхода из области видимости ?  

Нет. Память выделяется в стеке, как для обычных локальных переменных -- http://codepad.org/ddBj8wj5
Код
#include <stdio.h>

int c;

int main()
{
    int a;
    int b[rand()%10+2];
    int *p = (int*)malloc(4);
    printf("%p\n%p\n%p\n%p", &a, &b, &c, p);
    free(p);
    return 0;
}
Код
0xbf71c1e0
0xbf71c1b0
0x8049800
0x804a078

Первые два адреса находятся рядом, т.е., переменная a и массив b находятся в одной области памяти - в стеке.

Автор: just_geek 29.10.2009, 01:31
Это одно из многочисленных расширений gcc, так что ничего удивительного. Я думаю ты бы не сильно удивился, воспользовшись майрософтскими расширениями и столкнувшись с проблемами при портировании под gcc...

Автор: andrew_121 29.10.2009, 02:12
Цитата(just_geek @  29.10.2009,  01:31 Найти цитируемый пост)
воспользовшись майрософтскими расширениями

Разница в том, что микрософтовские расширения не стандартны. А мы говорим про стандарт С99.

Автор: just_geek 29.10.2009, 02:18
Ну это если о С99 говорить, для С89 или С++ это работает в виде расширения. Ну и даже для С99, реализация не до конца соответствует стандарту (по крайней мере в доках gcc так написано smile )

Автор: andrew_121 29.10.2009, 10:05
Цитата(just_geek @  29.10.2009,  02:18 Найти цитируемый пост)
Ну и даже для С99, реализация не до конца соответствует стандарту

Реализация С99 ?

Или реализация конкретно этого случая
Код

int chn;
short int  buf[ 512*chn ];

?

Автор: just_geek 29.10.2009, 13:24
да, реализация variable-length arrays.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)