Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/30: Рейтинг темы: голосов - 30, средняя оценка - 4.93
1 / 7 / 3
Регистрация: 20.12.2011
Сообщений: 58
1

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

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

Author24 — интернет-сервис помощи студентам
Просветите убогого =)
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2012, 23:23
Ответы с готовыми решениями:

JavaScript является каким то подразделом Java, или это совершенно разные языки?
Здравствуйте. Хочу изучит JavaScript, но не хотелось бы обходить вниманием Java. Подскажите,...

Чем они отличаются..
Помогите с файлами! F:file of string; F1:file of char; F2:text; Нужно написать чем они...

Чем они отличаются и какую приобрести?
Чем отличается Видеокарта ASUS STRIX GeForce GTX 750 Ti OC 2GB GDDR5 (STRIX-GTX750TI-OC-2GD5) от...

посмотрите чем они отличаются и какой лучше
В сборку реш взять процессор Процессор Intel Pentium G4600 OEM нашел на двух разных сайтах, стоят...

54
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.06.2012, 11:57 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
В смысле будет корректный вывод или просто будет компилиться?
На intel'е в 32-битном режиме будет корректный вывод (причём стабильный). На sparc v9, например, работать не будет, т.к. под ихние программные соглашения в данном примере звёзды в правильной ориентации не встанут
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.06.2012, 13:01 42
Ну так этот же код работает и на VC и Builder, но стоит изменить на
C++
1
2
3
4
5
struct string
{
  int n;
  char *s;
};
И VC выдает ошибку, а Builder игнорит вывод.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.06.2012, 13:12 43
Ну дык я и говорю о том, что звёзды встали нужным образом. printf ожидал достать из списка неименованных аргументов указатель на строку. Но в данном участке памяти лежала структура, по счастливой случайности у которой первое поле представляло собой указатель на строку. Поскольку в памяти нет никаких границ между объектами, а лежат просто данные, то printf прочитал из нужного места стека 4 байта, трактовал их как указатель на строку и случилось чудо
1
22 / 16 / 1
Регистрация: 15.10.2011
Сообщений: 305
26.06.2012, 13:50 44
Цитата Сообщение от silent_1991 Посмотреть сообщение
Avazart,у мелкомягких и стандартный-то С++-компилятор стандарт порой нехило нарушает, что уж говорить об их собственной "доработке" языка...
Так все-таки где конкретика НЕХИЛОГО нарушения стандартов, и чем он в этом плане хуже других был. Заявить что-то и сказать, что не требуйте доказательств... Вы же не Бог, упаси меня Господь.
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.06.2012, 16:11 45
nanex, конкретика была ниже, на счёт неверного разрешения перегрузки функций. Также на этом форуме обсуждались и более глубокие вещи, с которыми редко, но можно столкнуться (хотя я уже не помню, какие именно, но их хватило, чтобы я оставил этот компилятор). Хочется также сказать, что я не агитирую против использования мелкомягкого компилятора, так что не вижу смысла в подобных наездах.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.06.2012, 16:53 46
Цитата Сообщение от diagon Посмотреть сообщение
Не надо throw пользоваться, это практически бесполезный и непереносимый модификатор.
В компиляторах, соответствующих стандарту, throw замедляет рантайм. В VC++ еще веселее - там компилятор считает, что могут генирироваться лишь те исключения, которые указаны в throw(...). Естественно, по стандарту это далеко не так.
Что касается того, что делает throw с типами - вообще молчу, это терминальный ****ц.
Из темы ф-ция с throw
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
27.06.2012, 00:42 47
Avazart, что-то я не понял, что имелось ввиду
Цитата Сообщение от Avazart Посмотреть сообщение
Цитата Сообщение от diagon
В VC++ еще веселее - там компилятор считает, что могут генирироваться лишь те исключения, которые указаны в throw(...)
.
По идее, если сгенерится не указанное в спецификации исключение, то должен позватся unexpected, а MSVC что делает в этом случае? Проверил бы сам, но винды под рукой нет.
Цитата Сообщение от Evg Посмотреть сообщение
В общем-то то же самое, что я и говорил - просто звёзды встали соответствующим образом
Про то как это работает все понятно. Вопрос почему эту дырку не закрыли в компиляторе, GCC адекватные ворнинги просто при несоответсвие типа аргумента формату выдает, а тут тихо при явном нарушении.
Цитата Сообщение от Evg Посмотреть сообщение
Следующий код некорректен, но на intel'овских компиляторах будет работать
Это будет работать везде, где str будет как есть скопирована, и адрес s будет совпадать с началом объекта. По крайнее мере, я не вижу причин не работать.
Цитата Сообщение от Evg Посмотреть сообщение
На sparc v9, например, работать не будет, т.к. под ихние программные соглашения в данном примере звёзды в правильной ориентации не встанут
А вот здесь можно поподробнее?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.06.2012, 01:19 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/... 146d5cd26e
1
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
27.06.2012, 01:25 49
Цитата Сообщение от ForEveR Посмотреть сообщение
Студия не зовет unexpected_handler. Тупо зовет сразу abort и все.
Наркоманы чтоли, хоть бы просто игнорировали, чем так.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.06.2012, 01:35 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
}
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
27.06.2012, 11:04 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. При передаче указателя и структуры, состоящей из одного указателя, используются разные программные соглашения
6
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.06.2012, 00:26 52
Цитата Сообщение от Evg Посмотреть сообщение
А точнее, на sparc v8. При передаче указателя и структуры, состоящей из одного указателя, используются разные программные соглашения
Хм... Как я понимаю при вызове функции с эллипсисом аргументы складываются в стек. va_arg "достает" аргументы из стека (тупо сдвигает указатель). Единственная возможность не работать printf'у мне видится, если адрес указателя на строку не совпадает с адресом экземпляра структуры. Т.е. я не понимаю, как соглашение о передаче агрументов может "сломать" работу printf'а, ну либо я неправильно понял относительно программных соглашений.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
28.06.2012, 02:02 53
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как я понимаю при вызове функции с эллипсисом аргументы складываются в стек. va_arg "достает" аргументы из стека
Скажем так, что основные пояснения техники передачи параметров делаются на примере intel'овских компиляторов, где идёт передача через стек (видимо), а потому у людей передача параметров однозначно ассоциируется со стеком.

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

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

В "старых" программных соглашениях обычно все структуры передаются по косвенности независимо от размера. Поэтому в случае sparc v8 если передавать структуру с указателем (из нашего примера), то реально в регистре или в памяти будет указатель, но не на строку, а на копию структуры. В "новых" программных соглашениях (abi64 sparc v9, ia-64) обычно сделано более гибко: короткие структуры передаются по значению, а длинные - по косвенности.
2
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.06.2012, 10:49 54
Цитата Сообщение от Evg Посмотреть сообщение
Скажем так, что основные пояснения техники передачи параметров делаются на примере intel'овских компиляторов, где идёт передача через стек (видимо), а потому у людей передача параметров однозначно ассоциируется со стеком. Поправь меня, если я не прав.
На самом деле на любых более-менее приличных машинах с адэкватным количеством регистров часть параметров передаётся на регистрах. Из понятных соображений скорости. Передавать данные на регистрах быстрее, чем через память. Для большинства функций в реальной жизни параметров немного, а потому статистически значимая часть вызовов будет работать исключительно с передачей параметров на регистрах.
О передачей аргументов через регистры, я, естественно осведомлен, но в случае с эллипсисом, я не вижу возможности складывать аргументы куда-нибудь кроме как на стек, потому что если часть (все) будет передана через регистры, то как будет работать va_arg, я себе слабо представляю.
Цитата Сообщение от Evg Посмотреть сообщение
В "старых" программных соглашениях обычно все структуры передаются по косвенности независимо от размера. Поэтому в случае sparc v8 если передавать структуру с указателем (из нашего примера), то реально в регистре или в памяти будет указатель, но не на строку, а на копию структуры. В "новых" программных соглашениях (abi64 sparc v9, ia-64) обычно сделано более гибко: короткие структуры передаются по значению, а длинные - по косвенности.
Да, теперь я понял. va_arg "попросив" char* получит указатель на структуру.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
28.06.2012, 11:25 55
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
О передачей аргументов через регистры, я, естественно осведомлен, но в случае с эллипсисом, я не вижу возможности складывать аргументы куда-нибудь кроме как на стек, потому что если часть (все) будет передана через регистры, то как будет работать va_arg, я себе слабо представляю
И тем не менее у многих даже в этом случае делается передача параметров через регистры. А далее va_start сваливает регистры в стек. Такой подход быстрее с той точки зрения, что внутри функции разгребание эллиптических параметров может находиться под условием и необязательно запустится. А потому типа раньше времени незачем в стек писать
2
28.06.2012, 11:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2012, 11:25
Помогаю со студенческими работами здесь

Visual Studio 2005 и Visual Studio 2008 сильно ли они отличаются друк от друга?
привет ребята:) вот у меня есть Visual Studio 2005 и Visual Studio 2008 возник вопрос сильно ли...

Сложить три числа, если они отличаются не больше чем на 2
Есть к примеру 3 числа, A, B, C. Если эти числа отличаются не больше чем на 2, то сложить их. ...

Что такое входной и выходной поток? чем они отличаются?
Что такое входной и выходной поток? чем они отличаются?

Какие существуют виды условного оператора и чем они отличаются
5. Какие существуют виды условного оператора и чем они отличаются?


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

Или воспользуйтесь поиском по форуму:
55
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru