Почему функции потока должны быть объявлены как '__ cdecl'?

Поставьте intent.putExtra("countryNameKey",countryName); перед startActivity(intent);. Вы начинаете упражнение, используя намерение, прежде чем добавить к нему дополнительные. `

6
задан Rob 4 October 2008 в 14:05
поделиться

5 ответов

__ cdecl говорит компилятору использовать соглашение о вызовах C (в противоположность stdcall, fastcall или безотносительно другого соглашения о вызовах Ваши поддержки компилятора). Я верю, VC ++ использует stdcall по умолчанию.

Соглашение о вызовах влияет на вещи такой как, как аргументы продвинуты на стек (или регистры, в случае fastcall) и кто выталкивает аргументы от стека (вызывающая сторона или вызываемый).

В случае Повышения. Я полагаю, что это использует шаблонную специализацию для выяснения соответствующего функционального типа и соглашения о вызовах.

4
ответ дан 9 December 2019 в 22:42
поделиться

Поскольку Ваш поток будет названным функцией времени выполнения, которая управляет этим для Вас, и что функция ожидает, что это будет тем путем. Повышение разработало его другой путь.

Поместите точку останова в начале своего потока, функционируют и смотрят на стек, когда это назовут, Вы будете видеть функцию времени выполнения, которая звонит Вам.

1
ответ дан 9 December 2019 в 22:42
поделиться

Посмотрите на прототип для AfxBeginThread():

CWinThread* AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,
   LPVOID pParam,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 
);

AFX_THREADPROC определение типа для UINT(AFX_CDECL*)(LPVOID). Когда Вы передаете функцию AfxBeginThread(), это должно соответствовать тому прототипу, включая соглашение о вызовах.

Страницы MSDN на __cdecl и __stdcall (а также __fastcall и __thiscall) объясните за и против каждого соглашения о вызовах.

boost::thread конструктор использует шаблоны, чтобы позволить Вам передавать указатель функции или вызываемый функциональный объект, таким образом, он не имеет тех же ограничений как MFC.

4
ответ дан 9 December 2019 в 22:42
поделиться

Компиляторы C/C++ значением по умолчанию используют соглашение о вызовах C (продвигающий самый правый параметрический усилитель сначала на стеке) для него, позволяет работать с функциями с числом аргумента переменной как printf.

Соглашение о вызовах Паскаля (иначе "fastcall") продвигает крайний левый параметрический усилитель сначала. Это более быстро, хотя затраты Вы возможность легких функций аргумента переменной (я читал где-нибудь, они все еще возможны, хотя необходимо использовать некоторые приемы).

Из-за скорости, следующей из использования конвенции Паскаля, и Win32 и API MacOS использованием по умолчанию, что соглашение о вызовах, кроме определенных случаев.

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

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

1
ответ дан 9 December 2019 в 22:42
поделиться

Реальный ответ имеет отношение, как окна внутренне называют поток proc стандартной программой, и это ожидает, что функция будет соблюдать определенное соглашение о вызовах, которое в этом случае является макросом, WINAPI, который согласно моей системе определяется как:

#define WINAPI      __stdcall

Это означает, что вызванная функция ответственна за чистку стека. Причина, почему повышение:: поток может поддерживать произвольные функции, то, что он передает указатель на функциональный объект, используемый в вызове для поточной обработки:: создайте функцию к CreateThread. threadproc, связанный с потоком просто, называет оператор () на функциональном объекте.

Причина, которой MFC требует __ cdecl поэтому, имеет отношение к способу, в котором это внутренне вызывает функцию, переданную к вызову к AfxBeginThread. Нет никакого серьезного основания сделать это, если они не были планированием разрешения vararg параметры...

1
ответ дан 9 December 2019 в 22:42
поделиться
Другие вопросы по тегам:

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