Что такое __stdcall?

Еще одна причина, возможно, ваш URL-адрес включает некоторые скрытые символы, такие как «\n».

Если вы определяете свой url, как показано ниже, это исключение будет повышаться:

url = '''
http://google.com
'''

, потому что в строке есть '\n' hide. Фактически, URL-адрес становится:

\nhttp://google.com\n
138
задан Andrew Prock 9 January 2014 в 23:57
поделиться

7 ответов

__stdcall соглашение о вызовах, используемое для функции. Это говорит компилятору правила, которые касаются установки стека, продвижения аргументов и получения возвращаемого значения.

существует много других соглашений о вызовах, __cdecl, __thiscall, __fastcall и замечательно именованы __naked. __stdcall стандартное соглашение о вызовах для системных вызовов Win32.

Википедия покрывает детали .

, прежде всего, имеет значение, когда Вы вызываете функцию за пределами своего кода (например, API ОС), или ОС звонит Вам (как имеет место здесь с WinMain). Если компилятор не будет знать корректное соглашение о вызовах затем, то Вы, вероятно, получите очень странные катастрофические отказы, поскольку стеком не будут управлять правильно.

159
ответ дан cp.engr 9 January 2014 в 23:57
поделиться
  • 1
    Shouldn' t это быть добавленным к document' s голова, а не тело? – bobince 1 April 2009 в 23:51

C или сам C++ не определяют те идентификаторы. Они - расширения компилятора и поддерживают определенные соглашения о вызовах. Это определяет, куда поместить аргументы, в том, какой порядок, где вызванная функция найдет обратный адрес и так далее. Например, __ fastcall означает, что аргументы функций передаются по регистрам.

Статья Википедии предоставляет обзор различных соглашений о вызовах, найденных там.

36
ответ дан Johannes Schaub - litb 9 January 2014 в 23:57
поделиться
  • 1
    Технически, я предполагаю, возможно, но это работает... – nickf 2 April 2009 в 01:22

Ответы до сих пор касались деталей, но если Вы не предназначаете к выпадающему к блоку, затем все, что необходимо знать, то, что и вызывающая сторона и вызываемый должны использовать то же соглашение о вызовах, иначе Вы получите ошибки, которые трудно найти.

16
ответ дан MovEaxEsp 9 January 2014 в 23:57
поделиться
  • 1
    @bobince — Согласно спецификациям HTML, абсолютно, но всем браузерам распознают их где угодно. document.body также короче, чтобы ввести и быстрее выполниться, чем document.getElementsByTagName("head")[0] и избегает проблем перекрестного браузера insertRule/addRule. – Ben Blank 2 April 2009 в 17:05

Я соглашаюсь, что все ответы до сих пор корректны, но вот причина. C Microsoft и компиляторы C++ предоставляют различные соглашения о вызовах для (намеченной) скорости вызовов функции в и функциях C++ приложения C. В каждом случае вызывающая сторона и вызываемый должны договориться который соглашение о вызовах использовать. Теперь, сам Windows обеспечивает функции (API), и они были уже скомпилированы, поэтому когда Вы называете их, необходимо соответствовать им. Любые вызовы к Windows APIs и обратные вызовы из Windows APIs, должны использовать __ stdcall конвенция.

10
ответ дан Windows programmer 9 January 2014 в 23:57
поделиться
  • 1
    Решение должно сопровождаться длинным " duhhhh". Can' t верят мне didn' t думают о нем. – George Mauer 21 December 2012 в 16:34

Это имеет отношение, как функция вызвана - в основном порядок, в котором вещи поставились стек и кто ответственен за очистку.

Вот документация, но это не означает много, если Вы не понимаете первую часть:
http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx

5
ответ дан Joel Coehoorn 9 January 2014 в 23:57
поделиться

__stdcall используется для помещения аргументов функции в стек. После завершения функции он автоматически освобождает память. Это используется для фиксированных аргументов.

void __stdcall fnname ( int, int* )
{
    ...
}

int main()
{
    CreateThread ( NULL, 0, fnname, int, int*...... )
}

Здесь fnname имеет аргументы, которые он непосредственно помещает в стек.

4
ответ дан 23 November 2019 в 23:34
поделиться
10
ответ дан 23 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: