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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.87
Inferiym
 Аватар для Inferiym
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
17.06.2012, 23:23     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #1
Просветите убогого =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2012, 23:23     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки?
Посмотрите здесь:

а как вам это чем отличаются C++
Начинать изучение с visual или с builder? C++
C++ STL list<> помогите есть затруднение Совсем не пойму в чем дело!!!
Какие существуют виды условного оператора и чем они отличаются C++
C++ std::map что такое и с чем это есть
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 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
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
24.06.2012, 23:48     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #22
Пробовал на трех компилятора данный код
VC2010 выдает иероглефы
Builder2009 никак не регирует, как будто просто этих строчек нет
QtCreator заканчивается окошком "прекращение работы программы" т.е краш.

И на мой взгляд ни один из результатов не является нормальным...
По хорошему должна быть ошибка или хотябы ворнинг...
И краш явно не лучший вариант...
Его можно заметить, а можно и не заметить, а вот пользователь его точно заметит
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 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++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 00:21     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #24
Evg, std::string не является POD'ом, через эллипсис можно предавать только POD'ы. MSVC должен выдавать хотя бы warning.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
25.06.2012, 00:38     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #25
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
через эллипсис можно предавать только POD'ы
О как... Это точно? А то в первом приближении не вижу причин, почему нельзя
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 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
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 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++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 01:06     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #30
Цитата Сообщение от Evg Посмотреть сообщение
А есть идеи о причинах?
Как я понимаю, аргументы перед вызовом копируются в стек, потом с помощью va_arg достаются, не POD типы нельзя скопировать "как есть", поэтому и запретили их использование.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
25.06.2012, 01:07     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #31
Цитата Сообщение от Evg Посмотреть сообщение
А есть идеи о причинах?
Кажется, понял. В точке вызова будет создан объект, отвечающий за параметр. Но внутри функции объект уже нельзя корректно уничтожить, т.к. функция об этом объекте ничего не знает
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 01:12     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #32
Цитата Сообщение от DaskOFF Посмотреть сообщение
Каким же компилятором лучше пользоваться новичку, чтобы в будущем не было много проблем с тем, что в одном компиляторе что-то было в другом нету
если не сложно вариант платной(если таковая имеется) и бесплатно
Любым, просто документацией нужно пользоватся не специфичной для компилятора, и тогда пробем не должно быть.
Цитата Сообщение от Evg Посмотреть сообщение
Кажется, понял. В точке вызова будет создан объект, отвечающий за параметр. Но внутри функции объект уже нельзя корректно уничтожить, т.к. функция об этом объекте ничего не знает
Не понятно, не зря же есть va_end, который и так должен подчищать все что нужно перед возвратом.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
25.06.2012, 01:16     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #33
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Не понятно, не зря же есть va_end, который и так должен подчищать все что нужно перед возвратом.
va_end как бы подчищает стек (т.е. плоскую память), хотя я ещё ни разу не видел реализации, где va_end был чем-то, отличным от пустышки

Здесь проблема не в чистке, а в вызове деструкторов. В точке вызова va_end уже нет никакой информации о том, каких классов и сколько объектов было положено в стек в точке вызова
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
25.06.2012, 20:52     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #37
Цитата Сообщение от ForEveR Посмотреть сообщение
Так что студия имеет на это право (если говорить о студии 2010 и выше).
Имеет право поддерживать передачу POD через эллипсис, но вот печатать std::string через %s уж точно нет.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2012, 20:58     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #38
CyBOSSeR, Да, по идее не имеет. Причина.
http://stackoverflow.com/questions/1...-visual-studio
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 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++ Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли
Числа считаются равными если они отличаются не более, чем на (10^-12) / c++ / как реализовать эту возможность? C++

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

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

Текущее время: 11:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru