Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

Не понятно что делает __success(return >= 0) - C++

12.07.2015, 17:46. Просмотров 511. Ответов 11
Метки нет (Все метки)

Увидел определение HRESULT
C++
1
typedef __success(return >= 0) long HRESULT;
не ясно что это означает? это похоже команда препроцессора потому что два подчеркивания и что она делает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2015, 17:46
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не понятно что делает __success(return >= 0) (C++):

Что делает Return в плюсах? - C++
Судя по прочитанной литературе по с++ return что-то возвращает в вызывающую программу, но в одном месте попался странный код и не только...

Что делает return в функции void? - C++
void handle_arrival(vector<Car>& cars, vector< stack<string> >& parking_lot, const string& plate) { // TODO: Handle car arrivals ...

как i двигается понятно но вот не понятно как это делает j ? - C++
Здравствуйте, вопрос очень глупы но все же есть цикл for (int i = 0,j = 0; i < source.length; i++) как i двигается понятно но вот не...

Как сделать так, что если файл существует return true, если нет - return false - C++
Здравствуйте, я новичок в программировании. Мой вопрос очень прост: как сделать так, что если файл существует return true если нет return...

Слабо создать программу, которая много чего делает, а в main только return 0? - C++
Пояснение: Имеется некая функции Function() {} Причем она может делать что угодно. Кто-то знает, как запустить эту функцию НЕ из...

Что означает запись в скобках и что возвращает return - C++
Всем привет! Начал читать книгу BecomeAnXcoder и тут появился вопрос. В пример приведен такой код circleArea(float theRadius) //(1) ...

11
Evg
12.07.2015, 18:48
  #2

Не по теме:

Ты уже не в первый раз связываешь стартовые подчерки с препроцессированием. Это не верно. Символ подчерк - это один из символов, допустимых для имён (как и символы a, b, c). Ну и ссылка до кучи: Что означают префиксы "_" и "__"?.

Я не утверждаю, что __success не является макросом (если данный пример - это какая-то конструкция из современных стандартов языка, то я не знаю, что оно делает), просто говорю, что нельзя утверждать "если имя начинается, значит это макрос"

0
gray_fox
What a waste!
1552 / 1257 / 74
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
12.07.2015, 19:15 #3
http://stackoverflow.com/questions/4...sreturn-0-long

Не по теме:

первая же ссылка, ну...

0
Evg
Эксперт CАвтор FAQ
18921 / 6881 / 504
Регистрация: 30.03.2009
Сообщений: 19,379
Записей в блоге: 30
12.07.2015, 22:59 #4
Если я правильно понял что там написано, то __success - это встроенная конструкция того языка Си, который поддерживает микрософтовский компилятор (т.е. язык Си с микрософтовскими расширениями). Хотя нигде прямым текстом такого написано не было
0
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
13.07.2015, 09:46  [ТС] #5
Короче я так понял он ничего не делает

Добавлено через 2 часа 12 минут
Цитата Сообщение от Evg Посмотреть сообщение
Ты уже не в первый раз связываешь стартовые подчерки с препроцессированием. Это не верно. Символ подчерк - это один из символов, допустимых для имён (как и символы a, b, c). Ну и ссылка до кучи: Что означяют префиксы "_" и "__"?.
А может быт что просто некоторые функции не показывает определение, ну типо они мб. в dll размещены а файлах только объявления. С двумя подчеркиваниями может быть обычная функция определение которой находится в dll, а я думал мы не можем посмотреть ее реализацию - значит это типо функция препроцессора.
0
0x10
2549 / 1729 / 264
Регистрация: 24.11.2012
Сообщений: 4,351
13.07.2015, 10:03 #6
Цитата Сообщение от ninja2 Посмотреть сообщение
С двумя подчеркиваниями может быть обычная функция определение которой находится в dll, а я думал мы не можем посмотреть ее реализацию - значит это типо функция препроцессора.
Это все косвенные признаки. В любой непонятной ситуации - см доки.
0
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
13.07.2015, 10:14  [ТС] #7
Вообще эта штука
C++
1
typedef __success(return >= 0) long HRESULT;
Видимо как BOOL выступает. От есть определение функции при создании COM интерфейсов QueryInterface. Вот ее определение:
C++
1
2
3
4
5
STDMETHODIMP CSpaceship::XMotion::QueryInterface(REFIID iid, LPVOID* ppvObj)
{
    METHOD_PROLOGUE(CSpaceship,Motion)
    return pThis->ExternalQueryInterface(&iid,ppvObj);
}
этот макрос STDMETHODIMP :
C++
1
#define STDMETHODIMP            HRESULT STDMETHODCALLTYPE
HRESULT мы знаем что такое и что такое STD... это просто соглашение о вызовах __stdcall
И получается у нас функция вида:
C++
1
2
3
4
5
__success(return >= 0) __stdcall CSpaceship::XMotion::QueryInterface(REFIID iid, LPVOID* ppvObj)
{
    METHOD_PROLOGUE(CSpaceship,Motion)
    return pThis->ExternalQueryInterface(&iid,ppvObj);
}
там вместо __success(return >= 0) должно хз. наверно стоять BOOL, типо удачно или неудачно получили указатель на интерфейс, а у нас стоить хз что

Только что посмотрел она имеет свое определение вот оно:
C++
1
#define __success(expr)          __allowed(on_function_or_typedecl)
и дальше __allowed
C++
1
#define __allowed(p) __$allowed_##p
что означает знак доллара в макросе хз.????
и идем дальше что? Что то кажется что выражение __success передается выражение которое вернется из функции QueryInterface допустим 0 То у нас 0>=0 получается TRUE и появляется новый макрос __allowed_TRUE или хз. или такой __allowed_0, но таких макросов и определений нету, они не определены, что там происходит хз.
Ну короче таких макросов нету.

ВЫше ошибся, там отакая фигня вызывается __allowed(on_function_or_typedecl) , expr не подставляется, а что такое on_function_or_typedecl хз. его определения нету.

Добавлено через 8 минут
Вот определение ExternalQueryInterfaceв классе CCmdTarget:
C++
1
DWORD ExternalQueryInterface(const void*, LPVOID* ppvObj);
А от определение в IUnknown:
C++
1
2
3
virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
                /* [in] */ REFIID riid,
                /* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) = 0;
Так как мы возвращаем из QueryInterface значинеи типа DWORD, то что получается HRESULT это есть DWORD???? Ничего не ясно, вообще то по идее это должно быть BOOL
0
Max Dark
шКодер самоучка
1874 / 1674 / 608
Регистрация: 09.10.2013
Сообщений: 3,719
Записей в блоге: 6
Завершенные тесты: 2
13.07.2015, 10:31 #8
ninja2, я встречал макросы SUCCESSED/FAILED, используемый для проверки успеха функций как раз возвращающих HRESULT
в коде это выглядит примерно как:
C++
1
2
3
if(SUCCESSED(SomeFunctionCall())) {
    //... какие то действия при успехе операции
}
похоже что в __success указывается условие успеха для макроса SUCCESSED
но это только мои догадки...
0
Evg
Эксперт CАвтор FAQ
18921 / 6881 / 504
Регистрация: 30.03.2009
Сообщений: 19,379
Записей в блоге: 30
13.07.2015, 12:17 #9
Цитата Сообщение от ninja2 Посмотреть сообщение
А может быт что просто некоторые функции не показывает определение, ну типо они мб. в dll размещены а файлах только объявления. С двумя подчеркиваниями может быть обычная функция определение которой находится в dll, а я думал мы не можем посмотреть ее реализацию - значит это типо функция препроцессора.
Зачем гадать и предполагать, если можно взять и посмотреть препроцессорную выдачу?

Цитата Сообщение от ninja2 Посмотреть сообщение
что означает знак доллара в макросе хз.????
Доллар скорее всего является обычным символом, допустимым в именах идентификаторов

По итогу всего получи препроцессорную выдачу от своего теста и там увидишь конечный итог, т.е. то, что попадает на вход компилятору
1
Kastaneda
13.07.2015, 14:00
  #10

Не по теме:

Evg, как ты распознаешь домыслы ТС? Это выглядит как русский, переведенный гугл транслитом на суахили, потом на иврит, а потом обратно на русский

0
ninja2
814 / 188 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
13.07.2015, 14:21  [ТС] #11
Цитата Сообщение от Evg Посмотреть сообщение
По итогу всего получи препроцессорную выдачу от своего теста и там увидишь конечный итог, т.е. то, что попадает на вход компилятору
я не знаю как выдачу препроцессора посмотреть
0
Evg
Эксперт CАвтор FAQ
18921 / 6881 / 504
Регистрация: 30.03.2009
Сообщений: 19,379
Записей в блоге: 30
13.07.2015, 15:22 #12

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
Evg, как ты распознаешь домыслы ТС?
По работе приходится сталкиваться с людьми, которые задают вопросы намного более непонятно, чем ТС



Цитата Сообщение от ninja2 Посмотреть сообщение
я не знаю как выдачу препроцессора посмотреть
В гугле забанили чтоли?
Могу ещё раз кинуть ссылку: http://www.cyberforum.ru/blogs/18334/blog100.html раздел 1.2
1
13.07.2015, 15:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2015, 15:22
Привет! Вот еще темы с ответами:

Структура и кое-что не понятно... - C++
Имеется такая структура struct Person { std::string surname; unsigned int year; bool operator < (const Person &sg) ...

Ошибка VC++ или не понятно что - C++
Вот такое сообщение при выполнение данной программы. Прогамма работает правильно хоть и пропускает пдчеркнутые пункты. Не знаю в чем...

Что в программе делает так, что процессор грузится на 100%? - C++
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки на процессор. Вот код программы, на компьютере жрет всю...

Жуткий билдер не понятно что творит и почему - C++
Народ объясните пожалуйста ничего понять не могу почему я объявляю переменные int mazda=0 и потом в процессе выполнения программы оно...


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

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

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