Поставьте intent.putExtra("countryNameKey",countryName);
перед startActivity(intent);
. Вы начинаете упражнение, используя намерение, прежде чем добавить к нему дополнительные. `
__ cdecl говорит компилятору использовать соглашение о вызовах C (в противоположность stdcall, fastcall или безотносительно другого соглашения о вызовах Ваши поддержки компилятора). Я верю, VC ++ использует stdcall по умолчанию.
Соглашение о вызовах влияет на вещи такой как, как аргументы продвинуты на стек (или регистры, в случае fastcall) и кто выталкивает аргументы от стека (вызывающая сторона или вызываемый).
В случае Повышения. Я полагаю, что это использует шаблонную специализацию для выяснения соответствующего функционального типа и соглашения о вызовах.
Поскольку Ваш поток будет названным функцией времени выполнения, которая управляет этим для Вас, и что функция ожидает, что это будет тем путем. Повышение разработало его другой путь.
Поместите точку останова в начале своего потока, функционируют и смотрят на стек, когда это назовут, Вы будете видеть функцию времени выполнения, которая звонит Вам.
Посмотрите на прототип для 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.
Компиляторы C/C++ значением по умолчанию используют соглашение о вызовах C (продвигающий самый правый параметрический усилитель сначала на стеке) для него, позволяет работать с функциями с числом аргумента переменной как printf.
Соглашение о вызовах Паскаля (иначе "fastcall") продвигает крайний левый параметрический усилитель сначала. Это более быстро, хотя затраты Вы возможность легких функций аргумента переменной (я читал где-нибудь, они все еще возможны, хотя необходимо использовать некоторые приемы).
Из-за скорости, следующей из использования конвенции Паскаля, и Win32 и API MacOS использованием по умолчанию, что соглашение о вызовах, кроме определенных случаев.
Если бы та функция имеет только один параметрический усилитель, в теории с помощью любого соглашения о вызовах было бы законно, хотя компилятор может осуществить то же соглашение о вызовах, используется для предотвращения любой проблемы.
Библиотеки повышения были разработаны глазом на мобильность, таким образом, они должны быть агностиком, относительно которой конвенции вызывающей стороны конкретный компилятор использует.
Реальный ответ имеет отношение, как окна внутренне называют поток proc стандартной программой, и это ожидает, что функция будет соблюдать определенное соглашение о вызовах, которое в этом случае является макросом, WINAPI, который согласно моей системе определяется как:
#define WINAPI __stdcall
Это означает, что вызванная функция ответственна за чистку стека. Причина, почему повышение:: поток может поддерживать произвольные функции, то, что он передает указатель на функциональный объект, используемый в вызове для поточной обработки:: создайте функцию к CreateThread. threadproc, связанный с потоком просто, называет оператор () на функциональном объекте.
Причина, которой MFC требует __ cdecl поэтому, имеет отношение к способу, в котором это внутренне вызывает функцию, переданную к вызову к AfxBeginThread. Нет никакого серьезного основания сделать это, если они не были планированием разрешения vararg параметры...