Как вызвать неверную функцию-обработчик, как get_s ()? - PullRequest
1 голос
/ 28 июня 2011

Я использовал следующий код для вызова недопустимого обработчика параметров, если пользователь вводит более 4 символов. На самом деле это функция gets_s(), которая вызывает обработчик.

...
    char arr[5];
    _invalid_parameter_handler newHandler;
    newHandler = myInvalidParameterHandler;
    _set_invalid_parameter_handler(newHandler);

    gets_s(arr,4);
...
}
void myInvalidParameterHandler(const wchar_t* expression,const wchar_t* function, 
   const wchar_t* file, 
   unsigned int line, 
   uintptr_t pReserved)
{
...
}

Теперь мой вопрос заключается в том, как gets_s () вызывает / вызывает обработчик внутри себя? Я спрашиваю об этом, потому что я хочу сделать что-то подобное в моей программе. Например. скажем, у меня есть функция, объявленная как-

EDIT:

Если при выполнении вышеуказанного кода пользователь вводит более 4 символов, то вызывается обработчик. Если я закомментирую неверный код, связанный с обработчиком, моя программа завершится сбоем. То же самое, чего я хочу добиться. Если кто-то использует мою функцию, он должен вести себя так же, как и я при использовании gets_s.Пожалуйста, не предполагайте, хорошо это или плохо. Я просто хочу узнать, что это .gets_s не знает, какую функцию обработчика я собираюсь установить. моя функция не знает, какой недопустимый func-обработчик установит пользователь. Я думаю, что может быть какая-то глобальная переменная времени выполнения C типа _invalid_parameter_handler, которую устанавливает функция _set_invalid_parameter_handler (), которую использует gets_s.

1 Ответ

1 голос
/ 28 июня 2011

На мой взгляд 1 и 3 - это одно и то же, и да, вы можете сделать это так. Пусть все ваши функции вызывают указатель на функцию в некоторой глобальной структуре, и все готово.

  • Настройка глобального объекта, который содержит указатель на функцию и некоторые данные учета
  • Когда функция обнаруживает что-то не так, она может вызвать обработчик

Но не делайте этого . Лучше вернуть статус ошибки, чем автоматически вызывать функцию, когда что-то «чувствует» неправильно. Затем вы можете проверить статус возврата и действовать по нему, вместо того чтобы какой-то автоматический обработчик вступил во владение.

EDIT

Из вашего комментария я полагаю, что вы не знаете о указателях функций .

/* here is the handling function */
void handler(char *msg)
{
    fprintf(stderr, "%s\n", msg);
}

void (*err_handler)

void some_function_like_gets(void *arg)
{
    if (NULL == arg) {
        (*err_handler)("Oh noes! You passed a NULL pointer :(");
        return;
    }

}


int main()
{
    /* ... */

    /* setting up handler */
    err_handler = handler;

    /* calling function */
    some_function_like_gets(NULL);

    /* ... */    
}

РЕДАКТИРОВАТЬ 2

Грустная часть в том, что вы отклонили это, хотя на странице MSDN написано:

[in] pNew Функциональный указатель к новому некорректному обработчику параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...