Смешанные соглашения о вызовах делают ошибки компиляции - PullRequest
2 голосов
/ 29 июня 2010

У меня есть библиотека (C ++), которая имеет некоторые функции API. Один из них объявлен как __cdecl, но получает указатель на функцию из __stdcall. Что-то вроде:

typedef  int (__stdcall *Func)(unsigned char* buffer);
//...
int ApiFunc(Func funcPtr); //This is __cdecl since it is an 'extern "C"' library and the calling convention is not specified

Тогда - у меня есть исполняемый проект C ++, который использует эту библиотеку, но не вызывает вышеуказанный API или использует тип Func.

После изменения соглашения о вызовах Func на __stdcall я получаю следующую ошибку компиляции:

ошибка C2995: 'std :: pointer_to_unary_function <_Arg, _Result, _Result (__cdecl *) (_ Arg)> std :: ptr_fun (_Result (__cdecl *) (_ Arg))': функция шаблон уже был определенный c: \ программные файлы \ microsoft visual studio 8 \ vc \ include \ функциональная

Есть идеи, что бы это могло быть?

Заранее спасибо !!

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

Они совместимы, по крайней мере, в Windows (а в Linux вообще нет __stdcall ...) Проблема заключалась в том, что по ошибке библиотека переопределила __stdcall для совместимости с Linux, как:

#ifndef __MYLIB_WIN32
//Just an empty define for Linux compilation
#define __stdcall
#endif

Проект exe включает это определение, и __MYLIB_WIN32 не был определен в нем, но только в библиотеке.Измените приведенное выше определение на:

#ifndef WIN32
//Just an empty define for Linux compilation
#define __stdcall
#endif

и все будет отлично.

Спасибо всем.

2 голосов
/ 29 июня 2010

Э-э-э ... они несовместимы.Вы должны указать одинаковое соглашение о вызовах на обеих сторонах вызова.В противном случае попытка вызова приведет к взрыву стека машин.

...