没有标准的方法可以做到这一点,而且我不知道有可用的库,但自己编写并不难:
#if defined(_WIN32) || defined(WIN32)
static void (*theHandler)(int);
static BOOL WINAPI winHandler(DWORD ctrlType)
{
theHandler((int)ctrlType);
return TRUE;
}
#endif
void installConsoleHandler(void (*handler)(int))
{
#if defined(_WIN32) || defined(WIN32)
theHandler = handler;
SetConsoleCtrlHandler(&winHandler, TRUE);
#else
/* sigaction, as you find in your links */
#endif
}
如果您保留此代码,您可以稍后将其扩展到其他平台:
#if windows
#elif linux || compatible
#elif whatever
#else
#error "not implemented for current platform"
#endif
你得到一个真正的图书馆......
上面的代码可以在 C 和 C++ 中使用(为此我更喜欢static
匿名命名空间......),因此您可以将它放在 .c 文件中(并将其编译为 C)。要使其再次在 C++ 中工作(如您所要求的那样),您需要告诉 C++ 编译器它是一个 C 函数(这意味着在 C++ 中没有名称修饰,否则将应用它,因此在期间找不到该函数链接),因此标题将包含:
#ifdef __cplusplus
extern "C"
{
#endif
void installConsoleHandler(void (*handler)(int));
#ifdef __cplusplus
}
#endif
(当然,你没有要求 C,但如果你几乎可以免费获得它(除了那些extern "C"
东西),为什么不随身携带它?永远不知道......)