如果用户输入超过 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 使用。
最佳答案
在我看来 1
和 3
是一样的,是的,你可以那样做。让您的所有函数都调用某个全局结构中的函数指针,然后就可以了。
- 设置一个包含函数指针和一些簿记数据的全局对象
- 当函数检测到错误时,它可以调用处理程序
但是不要这样做。返回错误状态比在“感觉”出问题时自动调用函数要好得多。然后您可以检查返回状态并对其采取行动,而不是由某些自动处理程序接管。
编辑
根据您的评论,我相信您不知道 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/