Сейчас на форуме: tyns777, zds, JustLife, 2nd, morgot (+5 невидимых)

 eXeL@B —› Программирование —› Код, удовлетворяющий спецификациям и не рабочий в VS
Посл.ответ Сообщение


Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 15 июня 2009 10:57
· Личное сообщение · #1

Возник спор с одним товарищем по сабжу. Ранее в VS были проблемы с long long, и с тем, что переменная, объявленная в заголовке цикла for оставалась после выхода из цикла. Сейчас обе проблемы поправлены. Кто какие знает ещё?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 15 июня 2009 23:12 · Поправил: s0larian
· Личное сообщение · #2

Это всё исправлено было в VS2003. Чичас компиллер (из VS2008) очень качественный, поддерживает стандарт, компилит весь boost и идёт с правильным STL.



Ранг: 38.2 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 июня 2009 23:18
· Личное сообщение · #3

Обычно вспоминаешь об этом когда начинаешь работать. А for после выхода из цикла - можно исправить в опциях компилятора : /Za Disables language extensions. Я этим пользовался лишь однажды. С родными заголовочными файлами такой номер не пройдёт, например - перестаёт понимать анонимные вложения в структурах:
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
}; выдаёт D:\DevStudi\VC98\Include\winnt.h(357) : error C2467: illegal declaration of anonymous 'struct'
struct {
DWORD LowPart;
LONG HighPart;
} u;



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 15 июня 2009 23:57 · Поправил: Hexxx
· Личное сообщение · #4

ну а то что если даже объявить функцию void main() и будет все равно вставлена инструкция xor eax,eax перед ret?
Т.е. фактически, добалено return 0, несмотря на тип void. Это даже в 2008 есть.

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 16 июня 2009 02:20
· Личное сообщение · #5

Hexxx, прикольный косяк. Кста, я думаю, это из-за того что по спецификации main() должен возвращать int, и на это расчитывает CRT.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 16 июня 2009 07:43
· Личное сообщение · #6

Hexxx
Не считаю это косяком. void нужен только для того, чтобы не париться с return. Какая разница что там вернёт main, если после него уже не мы правим балом?



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 16 июня 2009 09:10
· Личное сообщение · #7

Сказали void - должно быть void.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 16 июня 2009 11:21 · Поправил: cppasm
· Личное сообщение · #8

Hexxx пишет:
Сказали void - должно быть void.

Ну с таким раскладом void говорить было нельзя.
По стандарту main() должен возвращать int.
Хотя большинство компиляторов и void нормально обрабатывают, некоторые предупреждение выдают.
В общем это не косяк, а попытка подвести под стандарт написанный не по стандарту исходник.



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 16 июня 2009 12:27
· Личное сообщение · #9

Те компилеры, которые warning пишут - это правильные компилеры. А молча впихивать xor eax, eax - это саботаж. Такой же как в Delphi, когда for декрементил счетчик, хотя должен увеличивать.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 16 июня 2009 13:04
· Личное сообщение · #10

Hexxx пишет:
Такой же как в Delphi, когда for декрементил счетчик, хотя должен увеличивать.

Такой саботаж во многих сишных компиляторах есть, зовётся оптимизация
Для кода for(i=0;i<100;i++) {} если в теле цикла счётчик не используется, будет сгенерирован декремент до нуля.
На х86 это просто оптимальнее в плане быстродействия.
Компилятор же не должен буквально код транслировать в машинный.
Так можно сказать и какого это фига он циклы разворачивает ;)



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 16 июня 2009 14:48
· Личное сообщение · #11

cppasm пишет:
Компилятор же не должен буквально код транслировать в машинный.

Когда я отключил все оптимизации - должен.

а xor eax,eax лепится всегда.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 16 июня 2009 15:32
· Личное сообщение · #12

Hexxx пишет:
Сказали void - должно быть void.

Значение в eax после возврата void не определено, а значит возврат ноля это не баг.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 16 июня 2009 17:06
· Личное сообщение · #13

ntldr пишет:
Значение в eax после возврата void не определено

+1

Я только одного не пойму. Зачем топикстартеру это? Ну баги по-любому будут всегда, пока функционал растёт, хотя в таком серьёзном продукте как VS любые даже очень маленькие баги находят быстро.


 eXeL@B —› Программирование —› Код, удовлетворяющий спецификациям и не рабочий в VS
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати