【问题标题】:How to invoke invalid handler function like gets_s() does?如何调用像 gets_s() 这样的无效处理函数?
【发布时间】:2011-06-28 08:02:04
【问题描述】:

如果用户输入超过 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() 如何在内部调用/调用处理程序?我问这个是因为我想在我的程序中做类似的事情。例如。假设我有一个声明为类似的函数-

编辑:

如果在运行上述代码时用户输入超过 4 个字符,则调用处理程序。如果我注释掉无效的处理程序相关代码,那么我的程序将崩溃。我想要实现的相同。 如果有人使用我的函数,他应该得到与使用gets_s时相同的行为。请不要暗示这是好是坏。我只是想学习它。gets_s不知道我要设置哪个处理函数。类似地我的函数不知道用户将设置哪个无效的处理函数函数。我认为可能有一些 _invalid_parameter_handler 类型的 C 运行时全局变量,“_set_invalid_parameter_handler()”函数设置了 gets_s 使用的函数。

【问题讨论】:

    标签: c error-handling


    【解决方案1】:

    在我看来 13 是一样的,是的,你可以这样做。让你的所有函数调用某个全局结构中的函数指针,然后你就设置好了。

    • 设置一个包含函数指针和一些簿记数据的全局对象
    • 当函数检测到错误时,它可以调用处理程序

    但是不要这样做。返回错误状态比在“感觉”错误时自动调用函数要好得多。然后你可以检查返回状态并采取行动,而不是一些自动处理程序接管。

    编辑

    从你的评论中我相信你不知道function pointers

    /* 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

    可悲的是,尽管the MSDN page 说:

    [in] pNew函数指针 到新的无效参数处理程序。

    【讨论】:

    • 是的,我可以返回一些“故障代码”,但我想了解如何调用由“_set_invalid_parameter_handler”设置的处理程序,而不仅仅是其他一些函数。gets_s 是如何做到的。
    • @ryanlancer 我猜你不知道函数指针。我编辑了我的答案。
    • @ryanlancer 没问题,我对我的 cmets 也没有帮助 :-)
    • @ryanlancer :-) 并试图提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多