Друзья, подскажите кто знает, как такое чудо на MSVC реализовать: Код (Text): #define API_TYPE_F VOID #define API_ADDR_F 0x00123456 API_CALL(F, Arg1, Arg2, ...); Чтобы в итоге было нечто такое: Код (Text): ((API_TYPE_F (*)(Type1, Type2, ...))API_ADDR_F)(Arg1, Arg2, ...); UPD: Или на крайняк такое: Код (Text): ((API_TYPE_F (*)(DWORD, DWORD, ...))API_ADDR_F)(Arg1, Arg2, ...);
Код (Text): #define API_CALL(F, ...) \ ((API_TYPE_##F (*)(X(__VA_ARGS__)))API_ADDR_##F)(__VA_ARGS__) Осталось придумать как при помощи макроса X(...) формировать список типов
А как ты типы выяснять собираешься? По типу передаваемых аргументов? Напиши несколько макросов, на разное количество аргументов. А дальше оператором typeof.
Типы - хрен с ними. К тому же, похоже c typeof у MSVC/C++ какие-то проблемы, через одно место. Также выяснилось, что у __VA_ARGS__ и ellipsis (...) есть одна интересная особенность: они НЕ позволяют передавать пустой список параметров. Компилятор ругается с ошибкой. Причём, команда, занимающаяся компилятором об этом типа знает, но т.к. это не совсем баг, а так и задумано, то вот уже 2 года не спешит его править. Мне почему пустой список нужен - это вызов функции без параметров. Короче, MSVC это вещь в себе какая-то...
для __cdecl соглашения только 1) для с++ Код (Text): #define TF VOID #define AF 0xcccccccc #define C(F,...) ((T##F(*)(...))A##F)(__VA_ARGS__) int main(){ C(F); C(F,"s",678.f); C(F,987,"s",234); C(F,876.f,123,876,"s"); C(F,876,"s",234.f,876,234); C(F,876,123,"s",876,678,77.88f); } 2) для си удалите ... Код (Text): #define TF VOID #define AF 0xcccccccc #define C(F,...) ((T##F(*)())A##F)(__VA_ARGS__) int main(){ C(F); C(F,"s",678.f); C(F,987,"s",234); C(F,876.f,123,876,"s"); C(F,876,"s",234.f,876,234); C(F,876,123,"s",876,678,77.88f); }
osox Ух, добрый человек, респект и уважуха! Вот она, формула счастья: Код (Text): #define API_CALL(F, ...) ((API_TYPE_##F (*)(...))API_ADDR_##F)(__VA_ARGS__)