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

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

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

Просветите убогого =)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2012, 23:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос С + + и Visual C + + и чем они отличаются? Есть ли их изучение взаимно дополняющее или это совсем разные языки? (C++):

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

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

Часть чисел записывается с совсем противоположным знаком, чем они выводятся в консоли
Есть следующий код: #include <iostream> #include <math.h> #include <fstream>...

а как вам это чем отличаются
10)Литералы 33 и 33L Выберите один ответ. не отличаются отличаются...

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

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

54
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
26.06.2012, 11:57 #41
Цитата Сообщение от Avazart Посмотреть сообщение
В смысле будет корректный вывод или просто будет компилиться?
На intel'е в 32-битном режиме будет корректный вывод (причём стабильный). На sparc v9, например, работать не будет, т.к. под ихние программные соглашения в данном примере звёзды в правильной ориентации не встанут
1
Avazart
Эксперт С++
7680 / 5589 / 543
Регистрация: 10.12.2010
Сообщений: 25,069
Записей в блоге: 17
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
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
26.06.2012, 13:12 #43
Ну дык я и говорю о том, что звёзды встали нужным образом. printf ожидал достать из списка неименованных аргументов указатель на строку. Но в данном участке памяти лежала структура, по счастливой случайности у которой первое поле представляло собой указатель на строку. Поскольку в памяти нет никаких границ между объектами, а лежат просто данные, то printf прочитал из нужного места стека 4 байта, трактовал их как указатель на строку и случилось чудо
1
nanex
22 / 16 / 1
Регистрация: 15.10.2011
Сообщений: 305
26.06.2012, 13:50 #44
Цитата Сообщение от silent_1991 Посмотреть сообщение
Avazart,у мелкомягких и стандартный-то С++-компилятор стандарт порой нехило нарушает, что уж говорить об их собственной "доработке" языка...
Так все-таки где конкретика НЕХИЛОГО нарушения стандартов, и чем он в этом плане хуже других был. Заявить что-то и сказать, что не требуйте доказательств... Вы же не Бог, упаси меня Господь.
1
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
26.06.2012, 16:11 #45
nanex, конкретика была ниже, на счёт неверного разрешения перегрузки функций. Также на этом форуме обсуждались и более глубокие вещи, с которыми редко, но можно столкнуться (хотя я уже не помню, какие именно, но их хватило, чтобы я оставил этот компилятор). Хочется также сказать, что я не агитирую против использования мелкомягкого компилятора, так что не вижу смысла в подобных наездах.
1
Avazart
Эксперт С++
7680 / 5589 / 543
Регистрация: 10.12.2010
Сообщений: 25,069
Записей в блоге: 17
26.06.2012, 16:53 #46
Цитата Сообщение от diagon Посмотреть сообщение
Не надо throw пользоваться, это практически бесполезный и непереносимый модификатор.
В компиляторах, соответствующих стандарту, throw замедляет рантайм. В VC++ еще веселее - там компилятор считает, что могут генирироваться лишь те исключения, которые указаны в throw(...). Естественно, по стандарту это далеко не так.
Что касается того, что делает throw с типами - вообще молчу, это терминальный ****ц.
Из темы http://www.cyberforum.ru/cpp-beginners/thread586970-page2.html
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 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
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
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/090a813321501784ae8486146d5cd26e
1
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
27.06.2012, 01:25 #49
Цитата Сообщение от ForEveR Посмотреть сообщение
Студия не зовет unexpected_handler. Тупо зовет сразу abort и все.
Наркоманы чтоли, хоть бы просто игнорировали, чем так.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
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
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 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
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.06.2012, 00:26 #52
Цитата Сообщение от Evg Посмотреть сообщение
А точнее, на sparc v8. При передаче указателя и структуры, состоящей из одного указателя, используются разные программные соглашения
Хм... Как я понимаю при вызове функции с эллипсисом аргументы складываются в стек. va_arg "достает" аргументы из стека (тупо сдвигает указатель). Единственная возможность не работать printf'у мне видится, если адрес указателя на строку не совпадает с адресом экземпляра структуры. Т.е. я не понимаю, как соглашение о передаче агрументов может "сломать" работу printf'а, ну либо я неправильно понял относительно программных соглашений.
1
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
28.06.2012, 02:02 #53
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как я понимаю при вызове функции с эллипсисом аргументы складываются в стек. va_arg "достает" аргументы из стека
Скажем так, что основные пояснения техники передачи параметров делаются на примере intel'овских компиляторов, где идёт передача через стек (видимо), а потому у людей передача параметров однозначно ассоциируется со стеком.

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

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

В "старых" программных соглашениях обычно все структуры передаются по косвенности независимо от размера. Поэтому в случае sparc v8 если передавать структуру с указателем (из нашего примера), то реально в регистре или в памяти будет указатель, но не на строку, а на копию структуры. В "новых" программных соглашениях (abi64 sparc v9, ia-64) обычно сделано более гибко: короткие структуры передаются по значению, а длинные - по косвенности.
2
CyBOSSeR
Эксперт С++
2309 / 1682 / 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
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,437
Записей в блоге: 30
28.06.2012, 11:25 #55
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
О передачей аргументов через регистры, я, естественно осведомлен, но в случае с эллипсисом, я не вижу возможности складывать аргументы куда-нибудь кроме как на стек, потому что если часть (все) будет передана через регистры, то как будет работать va_arg, я себе слабо представляю
И тем не менее у многих даже в этом случае делается передача параметров через регистры. А далее va_start сваливает регистры в стек. Такой подход быстрее с той точки зрения, что внутри функции разгребание эллиптических параметров может находиться под условием и необязательно запустится. А потому типа раньше времени незачем в стек писать
2
28.06.2012, 11:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 11:25
Привет! Вот еще темы с решениями:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
55
Ответ Создать тему
Опции темы

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