Я согласен с Джонатаном Леффлером, что это, вероятно, невозможно стандартным способом. Возможно, это будет возможно в некоторой степени, в зависимости от компилятора и даже версии компилятора, но вам придется поэкспериментировать, чтобы определить возможные подходы и принять тот факт, что поведение компилятора было непреднамеренным и могло быть «исправлено» в более поздних версиях. 1001 *
Например, в g++
версии 4.4.4 в Debian Squeeze вы можете вызвать ошибку компилятора для функций, которые не stdcall
, при таком подходе:
void my_func() __attribute__((stdcall));
void my_func() { }
void my_other_func() { }
template <typename ret_, typename... args_>
struct stdcall_fun_t
{
typedef ret_ (*type)(args_...) __attribute__((stdcall));
};
int main()
{
stdcall_fun_t<void>::type pFn(&my_func),
pFn2(&my_other_func);
}
g++ -std=c++0x
не может скомпилировать этот код, потому что:
SO2936360.cpp: 17: ошибка: недопустимое преобразование из «void () ()» в «void () ()»
Строка 17 - это объявление pFn2
. Если я избавлюсь от этого объявления, то компиляция завершится успешно.
К сожалению, эта техника не работает с cdecl
.