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

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

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

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

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

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

Что делает 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 двигается понятно но вот не...

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

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

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

Что значит return(n>=0)?n:-n) - C++
Объясните кто сможет return((n>=0)?n:-n)

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
12.07.2015, 18:48
  #2

Не по теме:

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

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

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

Не по теме:

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

Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
12.07.2015, 22:59     Не понятно что делает __success(return >= 0) #4
Если я правильно понял что там написано, то __success - это встроенная конструкция того языка Си, который поддерживает микрософтовский компилятор (т.е. язык Си с микрософтовскими расширениями). Хотя нигде прямым текстом такого написано не было
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
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
13.07.2015, 10:03     Не понятно что делает __success(return >= 0) #6
Цитата Сообщение от ninja2 Посмотреть сообщение
С двумя подчеркиваниями может быть обычная функция определение которой находится в dll, а я думал мы не можем посмотреть ее реализацию - значит это типо функция препроцессора.
Это все косвенные признаки. В любой непонятной ситуации - см доки.
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
шКодер самоучка
1784 / 1585 / 576
Регистрация: 09.10.2013
Сообщений: 3,546
Записей в блоге: 6
Завершенные тесты: 2
13.07.2015, 10:31     Не понятно что делает __success(return >= 0) #8
ninja2, я встречал макросы SUCCESSED/FAILED, используемый для проверки успеха функций как раз возвращающих HRESULT
в коде это выглядит примерно как:
C++
1
2
3
if(SUCCESSED(SomeFunctionCall())) {
    //... какие то действия при успехе операции
}
похоже что в __success указывается условие успеха для макроса SUCCESSED
но это только мои догадки...
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
13.07.2015, 12:17     Не понятно что делает __success(return >= 0) #9
Цитата Сообщение от ninja2 Посмотреть сообщение
А может быт что просто некоторые функции не показывает определение, ну типо они мб. в dll размещены а файлах только объявления. С двумя подчеркиваниями может быть обычная функция определение которой находится в dll, а я думал мы не можем посмотреть ее реализацию - значит это типо функция препроцессора.
Зачем гадать и предполагать, если можно взять и посмотреть препроцессорную выдачу?

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

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

Не по теме:

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

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 out? - C++
///

Что значит слово return? - C++
что значит слово return?

Что означает выражение стоящее после return? - C++
Всем привет. Довольно часто в уроках по c++. Вижу после написания программы либо функциии. return переменная; Что это значит? ...

Что делает операция new? - C++
spis *newl; newl=new spis(temp); что делает операция new spis(temp); П.с spis *temp spis::spis(spis*&temp)

_splitpath что делает? - C++
Что такое, с чем его едят, когда применяется и о параметрах.


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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 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)
Ответ Создать тему
Опции темы

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