Макро-функция препроцессора, которая позволяет расширять библиотеку GUI

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

Моя проблема: моя макро-функция включает в себя другие директивы препроцессора, которые, я думаю, недопустимы. Я хочу закодировать мой REGISTER_CUSTOM_CALLBACK_FUNCTION таким образом, чтобы пользователь мог создавать свои собственные виджеты и регистрировать свою собственную функцию обратного вызова в основной библиотеке GUI. Любые идеи, как я все еще могу достичь того, что я пытаюсь сделать?

#define FORWARD_DECLARE_CALLBACK_FUNCTION(callbackFunctName) Integer callbackFunctName(Draw_Box& window, Integer windowIndex, Integer id, Text cmd, Text msg);

#define REGISTER_CUSTOM_CALLBACK_FUNCTION(callbackFunctName) \
    #ifndef CUSTOM_CALLBACK_1 \
        #define CUSTOM_CALLBACK_1 \
        FORWARD_DECLARE_CALLBACK_FUNCTION(callbackFunctName) \
    #elif !defined CUSTOM_CALLBACK_2 \
        #define CUSTOM_CALLBACK_2  \
        FORWARD_DECLARE_CALLBACK_FUNCTION(callbackFunctName) \
    #endif

// Intended Usage: In a customers code they will be able to create their own 
// Widgets with their own Window Callback functions like this...
REGISTER_CUSTOM_CALLBACK_FUNCTION(progressBarCallback)

... some other code

REGISTER_CUSTOM_CALLBACK_FUNCTION(hyperlinkCallback)

Вот обратный вызов главного окна, который вызывается на каждом тактовом шаге:

Integer main_callback(Draw_Box& window, Integer windowIndex, Integer id, Text cmd, Text msg)
{
    #ifdef CUSTOM_CALLBACK_1 
        CUSTOM_CALLBACK_1(window, windowIndex, id, cmd, msg); 
    #endif 
    #ifdef CUSTOM_CALLBACK_2 
        CUSTOM_CALLBACK_2(window, windowIndex, id, cmd, msg); 
    #endif 
}

Любые идеи, как я мог бы кодировать мой REGISTER_CUSTOM_CALLBACK_FUNCTION, чтобы позволить пользователю создавать свои собственные виджеты и зарегистрировать свою собственную функцию обратного вызова в основной библиотеке GUI?

0 ответов

Другие вопросы по тегам