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

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

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.07.2015, 17:46     Не понятно что делает __success(return >= 0) #1
Увидел определение HRESULT
C++
1
typedef __success(return >= 0) long HRESULT;
не ясно что это означает? это похоже команда препроцессора потому что два подчеркивания и что она делает?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
12.07.2015, 18:48
  #2

Не по теме:

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

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

gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
12.07.2015, 19:15     Не понятно что делает __success(return >= 0) #3
http://stackoverflow.com/questions/4...sreturn-0-long

Не по теме:

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

Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16844 / 5265 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
12.07.2015, 22:59     Не понятно что делает __success(return >= 0) #4
Если я правильно понял что там написано, то __success - это встроенная конструкция того языка Си, который поддерживает микрософтовский компилятор (т.е. язык Си с микрософтовскими расширениями). Хотя нигде прямым текстом такого написано не было
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
13.07.2015, 09:46  [ТС]     Не понятно что делает __success(return >= 0) #5
Короче я так понял он ничего не делает

Добавлено через 2 часа 12 минут
Цитата Сообщение от Evg Посмотреть сообщение
Ты уже не в первый раз связываешь стартовые подчерки с препроцессированием. Это не верно. Символ подчерк - это один из символов, допустимых для имён (как и символы a, b, c). Ну и ссылка до кучи: Что означяют префиксы "_" и "__"?.
А может быт что просто некоторые функции не показывает определение, ну типо они мб. в dll размещены а файлах только объявления. С двумя подчеркиваниями может быть обычная функция определение которой находится в dll, а я думал мы не можем посмотреть ее реализацию - значит это типо функция препроцессора.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
13.07.2015, 10:03     Не понятно что делает __success(return >= 0) #6
Цитата Сообщение от ninja2 Посмотреть сообщение
С двумя подчеркиваниями может быть обычная функция определение которой находится в dll, а я думал мы не можем посмотреть ее реализацию - значит это типо функция препроцессора.
Это все косвенные признаки. В любой непонятной ситуации - см доки.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
13.07.2015, 10:14  [ТС]     Не понятно что делает __success(return >= 0) #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
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
13.07.2015, 10:31     Не понятно что делает __success(return >= 0) #8
ninja2, я встречал макросы SUCCESSED/FAILED, используемый для проверки успеха функций как раз возвращающих HRESULT
в коде это выглядит примерно как:
C++
1
2
3
if(SUCCESSED(SomeFunctionCall())) {
    //... какие то действия при успехе операции
}
похоже что в __success указывается условие успеха для макроса SUCCESSED
но это только мои догадки...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16844 / 5265 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
13.07.2015, 12:17     Не понятно что делает __success(return >= 0) #9
Цитата Сообщение от ninja2 Посмотреть сообщение
А может быт что просто некоторые функции не показывает определение, ну типо они мб. в dll размещены а файлах только объявления. С двумя подчеркиваниями может быть обычная функция определение которой находится в dll, а я думал мы не можем посмотреть ее реализацию - значит это типо функция препроцессора.
Зачем гадать и предполагать, если можно взять и посмотреть препроцессорную выдачу?

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

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

Не по теме:

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

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
13.07.2015, 14:21  [ТС]     Не понятно что делает __success(return >= 0) #11
Цитата Сообщение от Evg Посмотреть сообщение
По итогу всего получи препроцессорную выдачу от своего теста и там увидишь конечный итог, т.е. то, что попадает на вход компилятору
я не знаю как выдачу препроцессора посмотреть
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2015, 15:22     Не понятно что делает __success(return >= 0)
Еще ссылки по теме:

Что делает return в функции void? C++
C++ Ошибка VC++ или не понятно что
C++ Что такое return out?

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16844 / 5265 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
13.07.2015, 15:22     Не понятно что делает __success(return >= 0) #12

Не по теме:

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



Цитата Сообщение от ninja2 Посмотреть сообщение
я не знаю как выдачу препроцессора посмотреть
В гугле забанили чтоли?
Могу ещё раз кинуть ссылку: http://www.cyberforum.ru/blogs/18334/blog100.html раздел 1.2
Yandex
Объявления
13.07.2015, 15:22     Не понятно что делает __success(return >= 0)
Ответ Создать тему
Опции темы

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