c - 如何像 gets_s() 一样调用无效的处理函数?

标签 c error-handling

如果用户输入超过 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 不知道我要设置哪个处理函数。类似地我的函数不知道用户将设置哪个无效处理程序 func。我认为可能有一些类型为 _invalid_parameter_handler 的 C 运行时全局变量,'_set_invalid_parameter_handler()' func 设置了 gets_s 使用。

最佳答案

在我看来 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 The function pointer to the new invalid parameter handler.

关于c - 如何像 gets_s() 一样调用无效的处理函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6503392/

相关文章:

c - 使用远程 GDB 在 Eclipse 中调试

error-handling - NodeJS 0.4.2 http.request : can the error event be fired after the response callback has been called?

python - 从 ApiRouter 引发异常不会运行异常处理程序,而是返回 500 内部服务器错误。快速API

asp.net-mvc - Web应用程序中应该/不应该显示什么信息?

swift - Swift 中除以 0 时捕获错误

c++ - 以下指针将写入多少字节?

c - 编译没有GCO的go库以在 Alpine 上运行,libczmq中出错

c - 加载二进制文件 - realloc() : invalid next size

validation - Struts2转换警告

iphone - C 结构到 NSArray