crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> причуды компиляторов.
molchanoviv
  опции профиля:
сообщение 20.2.2009, 11:15
Сообщение #1


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Сегодня на работе во время ожидания окончания очередной антивирусной проверки на просторах интернета наткнулся на такую штуку

#include <iostream>
int main()
{
int i = 5;

i = i++ + 1;

std::cout<< i << std::endl;

return 0;
}

При компиляции этого кода gcc выдает undefined behaviour и в кач-ве результата i=7, а интел хавает все без варнингов и результат i=6
Выводы делаем сами и желательно отписываем сюда.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 20.2.2009, 11:18
Сообщение #2


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


кто то не соответствует стандарту
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 20.2.2009, 11:41
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Оба соответствуют.
Это действительно undefined behaviour. Результат может быть любой в зависимости от компилятора и его опций.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 26.2.2009, 15:38
Сообщение #4


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Я как-то заметил еще одну интересную вещь. Не помню точно, какая версия, но компилятор из VS(cl.exe) не поддерживает динамические массивы такого типа(а они есть в стандарте), в то время как g++ тут не имеет проблем:
//это только кусок кода
int n=1;
std::cin >> n;
int array[n]; //VS здесь выдаст ошибку(не помню точно какую)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2009, 16:08
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(void* @ 26.2.2009, 15:38) *
Я как-то заметил еще одну интересную вещь. Не помню точно, какая версия, но компилятор из VS(cl.exe) не поддерживает динамические массивы такого типа(а они есть в стандарте), в то время как g++ тут не имеет проблем:
//это только кусок кода
int n=1;
std::cin >> n;
int array[n]; //VS здесь выдаст ошибку(не помню точно какую)

Известный факт! :) Borland на эту штуку тоже ругается! Лучше делать так - код воспримется любым компилятором:
//это только кусок кода
int n=2;
std::cin >> n;
int *array = new int[n]; //VS здесь выдаст ошибку(не помню точно какую)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 26.2.2009, 16:32
Сообщение #6


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Цитата(AD @ 26.2.2009, 15:08) *
Лучше делать так - код воспримется любым компилятором:

Я то знаю что можно делать так :) я лишь привел пример плохого придерживания стандартов некоторыми компиляторами

Сообщение отредактировал void* - 26.2.2009, 16:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 26.2.2009, 18:08
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


В стандарте динамических массивов нет - это расширение gcc.
Так что тут и микрософт и багланд как раз более соответствуют стандарту. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Novak
  опции профиля:
сообщение 26.2.2009, 18:18
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 319
Регистрация: 15.3.2008
Из: Замкадыш
Пользователь №: 121

Спасибо сказали: 28 раз(а)




Репутация:   6  


Цитата(Tonal @ 26.2.2009, 18:08) *
В стандарте динамических массивов нет

В стандарте динамических массивов пока нет 8)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.2.2009, 18:47
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Tonal @ 26.2.2009, 21:08) *
это расширение gcc.
вообще у него довольно много расширений, Торвальдс как-то объяснял, что GCC выбран из-за удобных, а порой и необходимых расширений. Поэтому Линух мелкосовтовским компиллером не соберешь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
void*
  опции профиля:
сообщение 26.2.2009, 21:06
Сообщение #10


Программист-самоучка
***

Группа: Участник
Сообщений: 429
Регистрация: 4.6.2008
Пользователь №: 193

Спасибо сказали: 28 раз(а)




Репутация:   3  


Цитата(Tonal @ 26.2.2009, 17:08) *
В стандарте динамических массивов нет - это расширение gcc.

Ясно, спасибо буду теперь знать. Просто очень давно сталкивался с этим, вот и подзабыл детали этой проблемы.

П.С. Кстати а может кто-нибудь привести реальные примеры непридерживания стандартов компилятором от Borland (интересно просто)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 14.1.2025, 0:00