Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.87
Inferiym
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
#1

С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? - C++

17.06.2012, 23:23. Просмотров 3734. Ответов 54
Метки нет (Все метки)

Просветите убогого =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2012, 23:23     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки?
Посмотрите здесь:
C++ Сложить три числа, если они отличаются не больше чем на 2
Какие существуют виды условного оператора и чем они отличаются C++
C++ Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли
а как вам это чем отличаются C++
Числа считаются равными если они отличаются не более, чем на (10^-12) / c++ / как реализовать эту возможность? C++
C++ STL list<> помогите есть затруднение Совсем не пойму в чем дело!!!
Начинать изучение с visual или с builder? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.06.2012, 23:11     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #21
Цитата Сообщение от Evg Посмотреть сообщение
Микрософтеры просто решили сделать дополнительные плюшки, дабы уберечь программистов от наиболее типичных ошибок
И добавить новые типичные ошибки.
C++
1
2
std::string str = "blabla";
printf("%s", str);
Работает в студии, хоть и противоречит здравому смыслу и падает в том же GCC.
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,290
Записей в блоге: 17
24.06.2012, 23:48     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #22
Пробовал на трех компилятора данный код
VC2010 выдает иероглефы
Builder2009 никак не регирует, как будто просто этих строчек нет
QtCreator заканчивается окошком "прекращение работы программы" т.е краш.

И на мой взгляд ни один из результатов не является нормальным...
По хорошему должна быть ошибка или хотябы ворнинг...
И краш явно не лучший вариант...
Его можно заметить, а можно и не заметить, а вот пользователь его точно заметит
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,677
Записей в блоге: 26
25.06.2012, 00:00     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #23
Цитата Сообщение от Avazart Посмотреть сообщение
Ну да, сборищик мусора для того же... ну и C#...
Да нет, тут дело не в сборщиках мусора, а в отсутствии контроля за границей допустимой памяти во всяких функциях типа strcpy

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
И добавить новые типичные ошибки.
C++
1
2
std::string str = "blabla";
printf("%s", str);
Работает в студии, хоть и противоречит здравому смыслу и падает в том же GCC.
А где тут ошибка? Просто при передаче класс передаётся по косвенности, а класс устроен так, что первое поле класса - массив char'ов. В итоге получается, что printf достаёт строку, как будто передавался указатель на массив char'ов. Ну или что-то около того. Собственно, функция printf является опасной (как и любая функция с vararg'ами), а потому такие эффекты - это нормально

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Пробовал на трех компилятора данный код
VC2010 выдает иероглефы
Builder2009 никак не регирует, как будто просто этих строчек нет
QtCreator заканчивается окошком "прекращение работы программы" т.е краш.
Потому что в run-time поддержке компиляторов разная реализация внутренностей класса string

Цитата Сообщение от Avazart Посмотреть сообщение
По хорошему должна быть ошибка или хотябы ворнинг...
gcc точно умеет выдавать ворнинг по -Wall. Думаю, что и остальные умеют

Цитата Сообщение от Avazart Посмотреть сообщение
И краш явно не лучший вариант...
Если программа написана криво, то при чём тут компилятор?
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 00:21     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #24
Evg, std::string не является POD'ом, через эллипсис можно предавать только POD'ы. MSVC должен выдавать хотя бы warning.
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,677
Записей в блоге: 26
25.06.2012, 00:38     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #25
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
через эллипсис можно предавать только POD'ы
О как... Это точно? А то в первом приближении не вижу причин, почему нельзя
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 00:44     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #26
Параграф 5.2.2 С++98, пункт 7:
When there is no parameter for a given argument, the argument is passed in such a way that the receiving function can obtain the value of the argument by invoking va_arg (lib.support.runtime). The lvalue-to-rvalue (conv.lval), array-to-pointer (conv.array), and function-to-pointer (conv.func) standard conversions are performed on the argument expression. After these conversions, if the argument does not have arithmetic, enumeration, pointer, pointer to member, or class type, the program is ill-formed. If the argument has a non-POD class type (clause class), the behavior is undefined. If the argument has integral or enumeration type that is subject to the integral promotions (conv.prom), or a floating point type that is subject to the floating point promotion (conv.fpprom), the value of the argument is converted to the promoted type before the call. These promotions are referred to as the default argument promotions.
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,677
Записей в блоге: 26
25.06.2012, 00:53     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #27
Ясно. А есть идеи о причинах?
DaskOFF
25.06.2012, 00:59
  #28

Не по теме:

тут велось обсуждение компиляторов и сразу назрел вопрос
Каким же компилятором лучше пользоваться новичку, чтобы в будущем не было много проблем с тем, что в одном компиляторе что-то было в другом нету
если не сложно вариант платной(если таковая имеется) и бесплатной

Evg
25.06.2012, 01:02
  #29

Не по теме:

Цитата Сообщение от DaskOFF Посмотреть сообщение

Не по теме:

тут велось обсуждение компиляторов и сразу назрел вопрос
Каким же компилятором лучше пользоваться новичку, чтобы в будущем не было много проблем с тем, что в одном компиляторе что-то было в другом нету
если не сложно вариант платной(если таковая имеется) и бесплатной

Мне кажется, что любой современный компилятор имеет какие-то свои собственные расширения. Так что если не иметь чёткого понимания, то с любым компилятором можно написать код, который не будет работать на другом компиляторе

CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 01:06     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #30
Цитата Сообщение от Evg Посмотреть сообщение
А есть идеи о причинах?
Как я понимаю, аргументы перед вызовом копируются в стек, потом с помощью va_arg достаются, не POD типы нельзя скопировать "как есть", поэтому и запретили их использование.
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,677
Записей в блоге: 26
25.06.2012, 01:07     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #31
Цитата Сообщение от Evg Посмотреть сообщение
А есть идеи о причинах?
Кажется, понял. В точке вызова будет создан объект, отвечающий за параметр. Но внутри функции объект уже нельзя корректно уничтожить, т.к. функция об этом объекте ничего не знает
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 01:12     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #32
Цитата Сообщение от DaskOFF Посмотреть сообщение
Каким же компилятором лучше пользоваться новичку, чтобы в будущем не было много проблем с тем, что в одном компиляторе что-то было в другом нету
если не сложно вариант платной(если таковая имеется) и бесплатно
Любым, просто документацией нужно пользоватся не специфичной для компилятора, и тогда пробем не должно быть.
Цитата Сообщение от Evg Посмотреть сообщение
Кажется, понял. В точке вызова будет создан объект, отвечающий за параметр. Но внутри функции объект уже нельзя корректно уничтожить, т.к. функция об этом объекте ничего не знает
Не понятно, не зря же есть va_end, который и так должен подчищать все что нужно перед возвратом.
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,677
Записей в блоге: 26
25.06.2012, 01:16     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #33
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Не понятно, не зря же есть va_end, который и так должен подчищать все что нужно перед возвратом.
va_end как бы подчищает стек (т.е. плоскую память), хотя я ещё ни разу не видел реализации, где va_end был чем-то, отличным от пустышки

Здесь проблема не в чистке, а в вызове деструкторов. В точке вызова va_end уже нет никакой информации о том, каких классов и сколько объектов было положено в стек в точке вызова
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 01:24     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #34
Цитата Сообщение от Evg Посмотреть сообщение
va_end как бы подчищает стек (т.е. плоскую память), хотя я ещё ни разу не видел реализации, где va_end был чем-то, отличным от пустышки
Здесь проблема не в чистке, а в вызове деструкторов. В точке вызова va_end уже нет никакой информации о том, каких классов и сколько объектов было положено в стек в точке вызова
Да, пожалуй, ты прав.
DaskOFF
25.06.2012, 01:30
  #35

Не по теме:

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Любым, просто документацией нужно пользоватся не специфичной для компилятора, и тогда пробем не должно быть.
получается от компилятора не зависит на каких машинах программа будет работать или нет
все зависит от кода ?

ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
25.06.2012, 10:13     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #36
В C++0x есть изменения по пункту 5.2.2.7

When there is no parameter for a given argument, the argument is passed in such a way that the receiving function can obtain the value of the argument by invoking va_arg (18.10). [ Note: This paragraph does not
apply to arguments passed to a function parameter pack. Function parameter packs are expanded during
template instantiation (14.5.3), thus each such argument has a corresponding parameter when a function
template specialization is actually called. — end note ] The lvalue-to-rvalue (4.1), array-to-pointer (4.2), and
function-to-pointer (4.3) standard conversions are performed on the argument expression. An argument that
has (possibly cv-qualified) type std::nullptr_t is converted to type void* (4.10). After these conversions,
if the argument does not have arithmetic, enumeration, pointer, pointer to member, or class type, the
program is ill-formed. Passing a potentially-evaluated argument of class type (Clause 9) having a non-
trivial copy constructor, a non-trivial move constructor, or a non-trivial destructor, with no corresponding
parameter, is conditionally-supported with implementation-defined semantics.
If the argument has integral
or enumeration type that is subject to the integral promotions (4.5), or a floating point type that is subject
to the floating point promotion (4.6), the value of the argument is converted to the promoted type before
the call. These promotions are referred to as the default argument promotions.
Так что студия имеет на это право (если говорить о студии 2010 и выше).
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 20:52     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #37
Цитата Сообщение от ForEveR Посмотреть сообщение
Так что студия имеет на это право (если говорить о студии 2010 и выше).
Имеет право поддерживать передачу POD через эллипсис, но вот печатать std::string через %s уж точно нет.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
25.06.2012, 20:58     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #38
CyBOSSeR, Да, по идее не имеет. Причина.
http://stackoverflow.com/questions/1...-visual-studio
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,677
Записей в блоге: 26
26.06.2012, 10:20     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #39
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Имеет право поддерживать передачу POD через эллипсис, но вот печатать std::string через %s уж точно нет.
Цитата Сообщение от ForEveR Посмотреть сообщение
CyBOSSeR, Да, по идее не имеет. Причина.
http://stackoverflow.com/questions/1...-visual-studio
В общем-то то же самое, что я и говорил - просто звёзды встали соответствующим образом. Следующий код некорректен, но на intel'овских компиляторах будет работать:

C
#include <stdio.h>
 
/* Как бы MSVC'ная реализация std::string */
struct string
{
  char *s;
};
 
int main (void)
{
  struct string str;
  str.s = "abc";
  printf ("%s\n", str);
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2012, 11:50     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки?
Еще ссылки по теме:
C++ в коде ниже есть ошибки. в чем они и как их устранить?
C++ std::map что такое и с чем это есть
Разные языки в одном файле C++
Visual C++ или C++ Builder в чем разница? C++
Чем отличаются компиляторы? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,290
Записей в блоге: 17
26.06.2012, 11:50     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #40
В смысле будет корректный вывод или просто будет компилиться?
Yandex
Объявления
26.06.2012, 11:50     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru