Форум программистов, компьютерный форум 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 что такое и с чем это есть
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16842 / 5263 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
26.06.2012, 11:57     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #41
Цитата Сообщение от Avazart Посмотреть сообщение
В смысле будет корректный вывод или просто будет компилиться?
На intel'е в 32-битном режиме будет корректный вывод (причём стабильный). На sparc v9, например, работать не будет, т.к. под ихние программные соглашения в данном примере звёзды в правильной ориентации не встанут
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
26.06.2012, 13:01     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #42
Ну так этот же код работает и на VC и Builder, но стоит изменить на
C++
1
2
3
4
5
struct string
{
  int n;
  char *s;
};
И VC выдает ошибку, а Builder игнорит вывод.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16842 / 5263 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
26.06.2012, 13:12     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #43
Ну дык я и говорю о том, что звёзды встали нужным образом. printf ожидал достать из списка неименованных аргументов указатель на строку. Но в данном участке памяти лежала структура, по счастливой случайности у которой первое поле представляло собой указатель на строку. Поскольку в памяти нет никаких границ между объектами, а лежат просто данные, то printf прочитал из нужного места стека 4 байта, трактовал их как указатель на строку и случилось чудо
nanex
22 / 16 / 2
Регистрация: 15.10.2011
Сообщений: 305
26.06.2012, 13:50     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #44
Цитата Сообщение от silent_1991 Посмотреть сообщение
Avazart,у мелкомягких и стандартный-то С++-компилятор стандарт порой нехило нарушает, что уж говорить об их собственной "доработке" языка...
Так все-таки где конкретика НЕХИЛОГО нарушения стандартов, и чем он в этом плане хуже других был. Заявить что-то и сказать, что не требуйте доказательств... Вы же не Бог, упаси меня Господь.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.06.2012, 16:11     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #45
nanex, конкретика была ниже, на счёт неверного разрешения перегрузки функций. Также на этом форуме обсуждались и более глубокие вещи, с которыми редко, но можно столкнуться (хотя я уже не помню, какие именно, но их хватило, чтобы я оставил этот компилятор). Хочется также сказать, что я не агитирую против использования мелкомягкого компилятора, так что не вижу смысла в подобных наездах.
Avazart
 Аватар для Avazart
6905 / 5145 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
26.06.2012, 16:53     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #46
Цитата Сообщение от diagon Посмотреть сообщение
Не надо throw пользоваться, это практически бесполезный и непереносимый модификатор.
В компиляторах, соответствующих стандарту, throw замедляет рантайм. В VC++ еще веселее - там компилятор считает, что могут генирироваться лишь те исключения, которые указаны в throw(...). Естественно, по стандарту это далеко не так.
Что касается того, что делает throw с типами - вообще молчу, это терминальный ****ц.
Из темы ф-ция с throw
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
27.06.2012, 00:42     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #47
Avazart, что-то я не понял, что имелось ввиду
Цитата Сообщение от Avazart Посмотреть сообщение
Цитата Сообщение от diagon
В VC++ еще веселее - там компилятор считает, что могут генирироваться лишь те исключения, которые указаны в throw(...)
.
По идее, если сгенерится не указанное в спецификации исключение, то должен позватся unexpected, а MSVC что делает в этом случае? Проверил бы сам, но винды под рукой нет.
Цитата Сообщение от Evg Посмотреть сообщение
В общем-то то же самое, что я и говорил - просто звёзды встали соответствующим образом
Про то как это работает все понятно. Вопрос почему эту дырку не закрыли в компиляторе, GCC адекватные ворнинги просто при несоответсвие типа аргумента формату выдает, а тут тихо при явном нарушении.
Цитата Сообщение от Evg Посмотреть сообщение
Следующий код некорректен, но на intel'овских компиляторах будет работать
Это будет работать везде, где str будет как есть скопирована, и адрес s будет совпадать с началом объекта. По крайнее мере, я не вижу причин не работать.
Цитата Сообщение от Evg Посмотреть сообщение
На sparc v9, например, работать не будет, т.к. под ихние программные соглашения в данном примере звёзды в правильной ориентации не встанут
А вот здесь можно поподробнее?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.06.2012, 01:19     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #48
CyBOSSeR, 12 MSVC.

C++
1
2
3
4
void some() throw (std::logic_error)
{
    throw std::runtime_error("Invalid exception");
}
1>Create.cpp(9): warning C4290: спецификация исключений C++ игнорируется, кроме случая, когда указывается, что функция не является __declspec(nothrow)

Полный код.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <stdexcept>
 
void foo() throw()
{
    throw std::logic_error("Invalid error");
}
 
void some() throw (std::logic_error)
{
    throw std::runtime_error("Invalid exception");
}
 
void handler()
{
    try
    {
        std::rethrow_exception(std::current_exception());
    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}
 
int main()
{
    std::set_unexpected(handler);
    some();
    foo();
}
Студия не зовет unexpected_handler. Тупо зовет сразу abort и все.
В gcc идет так - http://liveworkspace.org/code/090a81...8486146d5cd26e
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
27.06.2012, 01:25     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #49
Цитата Сообщение от ForEveR Посмотреть сообщение
Студия не зовет unexpected_handler. Тупо зовет сразу abort и все.
Наркоманы чтоли, хоть бы просто игнорировали, чем так.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.06.2012, 01:35     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #50
CyBOSSeR, Выкидывание исключения выводит в функцию _Cxx_Throw_Exception, в которой они полностью кладут на unexpected.
Вообщем спецификация исключений в MSVC бессмысленна.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// We want double underscore for CxxThrowException for ARM CE only
__declspec(noreturn) extern "C" void __stdcall
#if !defined(_M_ARM) || defined(_M_ARM_NT)
_CxxThrowException(
#else
__CxxThrowException(
#endif
        void*           pExceptionObject,   // The object thrown
        _ThrowInfo*     pThrowInfo          // Everything we need to know about it
) {
        EHTRACE_ENTER_FMT1("Throwing object @ 0x%p", pExceptionObject);
 
        static const EHExceptionRecord ExceptionTemplate = { // A generic exception record
            EH_EXCEPTION_NUMBER,            // Exception number
            EXCEPTION_NONCONTINUABLE,       // Exception flags (we don't do resume)
            NULL,                           // Additional record (none)
            NULL,                           // Address of exception (OS fills in)
            EH_EXCEPTION_PARAMETERS,        // Number of parameters
            {   EH_MAGIC_NUMBER1,           // Our version control magic number
                NULL,                       // pExceptionObject
                NULL,
#if _EH_RELATIVE_OFFSETS
                NULL                        // Image base of thrown object
#endif
            }                      // pThrowInfo
        };
        EHExceptionRecord ThisException = ExceptionTemplate;    // This exception
 
        ThrowInfo* pTI = (ThrowInfo*)pThrowInfo;
        if (pTI && (THROW_ISWINRT( (*pTI) ) ) )
        {
            ULONG_PTR *exceptionInfoPointer = *reinterpret_cast<ULONG_PTR**>(pExceptionObject);
            exceptionInfoPointer--; // The pointer to the ExceptionInfo structure is stored sizeof(void*) infront of each WinRT Exception Info.
 
            WINRTEXCEPTIONINFO* wei = reinterpret_cast<WINRTEXCEPTIONINFO*>(*exceptionInfoPointer);
            pTI = wei->throwInfo;
        }
 
        //
        // Fill in the blanks:
        //
        ThisException.params.pExceptionObject = pExceptionObject;
        ThisException.params.pThrowInfo = pTI;
#if _EH_RELATIVE_OFFSETS
        PVOID ThrowImageBase = RtlPcToFileHeader((PVOID)pTI, &ThrowImageBase);
        ThisException.params.pThrowImageBase = ThrowImageBase;
#endif
 
        //
        // If the throw info indicates this throw is from a pure region,
        // set the magic number to the Pure one, so only a pure-region
        // catch will see it.
        //
        // Also use the Pure magic number on Win64 if we were unable to
        // determine an image base, since that was the old way to determine
        // a pure throw, before the TI_IsPure bit was added to the FuncInfo
        // attributes field.
        //
        if (pTI != NULL)
        {
            if (THROW_ISPURE(*pTI))
            {
                ThisException.params.magicNumber = EH_PURE_MAGIC_NUMBER1;
            }
#if _EH_RELATIVE_OFFSETS
            else if (ThrowImageBase == NULL)
            {
                ThisException.params.magicNumber = EH_PURE_MAGIC_NUMBER1;
            }
#endif
        }
 
        //
        // Hand it off to the OS:
        //
 
        EHTRACE_EXIT;
#if defined(_M_X64) && defined(_NTSUBSET_)
        RtlRaiseException( (PEXCEPTION_RECORD) &ThisException );
#else
        RaiseException( ThisException.ExceptionCode,
                        ThisException.ExceptionFlags,
                        ThisException.NumberParameters,
                        (PULONG_PTR)&ThisException.params );
#endif
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16842 / 5263 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
27.06.2012, 11:04     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #51
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Про то как это работает все понятно. Вопрос почему эту дырку не закрыли в компиляторе, GCC адекватные ворнинги просто при несоответсвие типа аргумента формату выдает, а тут тихо при явном нарушении
Скажем так, gcc работает не совсем честно. Он распознаёт функцию printf. И даже более: printf как бы является встроенной функцией (builtin'ом) языка GNU-C. Эту встроенность по опции можно отменить:

C
#include <stdio.h>
 
int main (void)
{
  printf ("%d\n", &main);
  return 0;
}
Bash
$ gcc t.c
t.c: In function 'main':
t.c:5: warning: format '%d' expects type 'int', but argument 2 has type 'int (*)(void)'
 
$ gcc t.c -fno-builtin
<тишина>
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
А вот здесь можно поподробнее?
А точнее, на sparc v8. При передаче указателя и структуры, состоящей из одного указателя, используются разные программные соглашения
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.06.2012, 00:26     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #52
Цитата Сообщение от Evg Посмотреть сообщение
А точнее, на sparc v8. При передаче указателя и структуры, состоящей из одного указателя, используются разные программные соглашения
Хм... Как я понимаю при вызове функции с эллипсисом аргументы складываются в стек. va_arg "достает" аргументы из стека (тупо сдвигает указатель). Единственная возможность не работать printf'у мне видится, если адрес указателя на строку не совпадает с адресом экземпляра структуры. Т.е. я не понимаю, как соглашение о передаче агрументов может "сломать" работу printf'а, ну либо я неправильно понял относительно программных соглашений.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16842 / 5263 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
28.06.2012, 02:02     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #53
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как я понимаю при вызове функции с эллипсисом аргументы складываются в стек. va_arg "достает" аргументы из стека
Скажем так, что основные пояснения техники передачи параметров делаются на примере intel'овских компиляторов, где идёт передача через стек (видимо), а потому у людей передача параметров однозначно ассоциируется со стеком.

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

Следствием этого, как правило, является то, что аггрегатные значения передаются по косвенности. Т.е. по языку у тебя передача структуры по значению. Но по программным соглашениям в точке вызова будет сформирована в стеке копия параметра и в функцию передаётся указатель на копию (таким образом за счёт копии, фактический параметр никак нельзя будет внутри вызванной функции испортить).

В "старых" программных соглашениях обычно все структуры передаются по косвенности независимо от размера. Поэтому в случае sparc v8 если передавать структуру с указателем (из нашего примера), то реально в регистре или в памяти будет указатель, но не на строку, а на копию структуры. В "новых" программных соглашениях (abi64 sparc v9, ia-64) обычно сделано более гибко: короткие структуры передаются по значению, а длинные - по косвенности.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
28.06.2012, 10:49     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #54
Цитата Сообщение от Evg Посмотреть сообщение
Скажем так, что основные пояснения техники передачи параметров делаются на примере intel'овских компиляторов, где идёт передача через стек (видимо), а потому у людей передача параметров однозначно ассоциируется со стеком. Поправь меня, если я не прав.
На самом деле на любых более-менее приличных машинах с адэкватным количеством регистров часть параметров передаётся на регистрах. Из понятных соображений скорости. Передавать данные на регистрах быстрее, чем через память. Для большинства функций в реальной жизни параметров немного, а потому статистически значимая часть вызовов будет работать исключительно с передачей параметров на регистрах.
О передачей аргументов через регистры, я, естественно осведомлен, но в случае с эллипсисом, я не вижу возможности складывать аргументы куда-нибудь кроме как на стек, потому что если часть (все) будет передана через регистры, то как будет работать va_arg, я себе слабо представляю.
Цитата Сообщение от Evg Посмотреть сообщение
В "старых" программных соглашениях обычно все структуры передаются по косвенности независимо от размера. Поэтому в случае sparc v8 если передавать структуру с указателем (из нашего примера), то реально в регистре или в памяти будет указатель, но не на строку, а на копию структуры. В "новых" программных соглашениях (abi64 sparc v9, ia-64) обычно сделано более гибко: короткие структуры передаются по значению, а длинные - по косвенности.
Да, теперь я понял. va_arg "попросив" char* получит указатель на структуру.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 11:25     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки?
Еще ссылки по теме:

C++ в коде ниже есть ошибки. в чем они и как их устранить?
C++ Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли
Числа считаются равными если они отличаются не более, чем на (10^-12) / c++ / как реализовать эту возможность? C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16842 / 5263 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
28.06.2012, 11:25     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? #55
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
О передачей аргументов через регистры, я, естественно осведомлен, но в случае с эллипсисом, я не вижу возможности складывать аргументы куда-нибудь кроме как на стек, потому что если часть (все) будет передана через регистры, то как будет работать va_arg, я себе слабо представляю
И тем не менее у многих даже в этом случае делается передача параметров через регистры. А далее va_start сваливает регистры в стек. Такой подход быстрее с той точки зрения, что внутри функции разгребание эллиптических параметров может находиться под условием и необязательно запустится. А потому типа раньше времени незачем в стек писать
Yandex
Объявления
28.06.2012, 11:25     С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки?
Ответ Создать тему
Опции темы

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