C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
C++ argument of type is incompatible with parameter of type void (__cdecl*)(void), when calling std::atexit()
在使用某些C++库时,我经常遇到参数需要指向函数的函数。这意味着方法将不被接受。
比如性病的atexit(void (__cdecl*)(void));
在这种情况下,当您想从方法传递功能时,从类调用此类函数非常不方便。
我知道这两种解决方法,但它们有缺点/似乎不可能:
- 将方法声明为静态:表示该方法不能调用任何 来自同一类的其他非静态方法。
- 传递实际函数:绝对是一团糟,可能需要所有 各种黑魔法来执行propper功能 在方法内。
对于这些情况,通常还有哪些其他解决方法?或者至少对于从一个类调用 atexit(( 示例,其中一种方法作为退出函数是理想的。
atexit
函数在程序退出时以相反的顺序调用。此时还调用本地静态对象析构函数。所以在这个例子中:
void f()
{
static X x;
atexit(f1);
static Y y;
}
在第一次调用时,x
和y
析构函数将被注册为在程序退出时调用,并且f1()
将在y.Y::~Y()
和x.X::~X()
之间调用。
因此,如果创建要在销毁集合时调用的std::function
对象的集合,这可能是一种可行的解决方法。
它仍然可能无法很好地用于多个函数,因为所有函数都将在单个循环中调用,而不是相对于其他静态析构函数/退出调用的 LIFO 顺序。
另一种选择可能是查看at_thread_exit
.它具有不同的语义,但也可能满足您的需求。
@Remy Lebeau提到的Thunk可能是最好的解决方法。但实施起来可能并不容易,这就是为什么我建议也考虑其他解决方法。
相关文章:
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 不能将 "void *" 类型的值分配给类型 "RANDOMSTRUCT *" 的实体
- 在C++中将uint64_t转换为void类型的目的是什么
- 带有void类型和参数的C++11模板专用化
- 编写完整专业化以识别void类型的问题
- 非类型模板参数可以是 "void*" 类型吗?
- 如何将“void *”类型更改为“字符串”类型
- 智能感知:不能将 "void" 类型的值分配给类型 "double" 的实体
- 传递对指向 void 类型的指针的指针的引用
- 无法从 void* 类型转换(类名::)() 以键入 void*(*)(void*)
- 如何使用void类型处理递归回溯返回
- 异步返回 void 类型的未来,而不是预期类型
- std::is_same 表示 void 函数 (..) 和 void 类型
- void * 类型的参数与类型的参数不兼容
- C++:无法使用 'void' 类型的右值初始化 'void (*)()' 类型的参数
- void类型的OpenGL C++参数与void(*)()类型的参数不兼容
- 为什么我们不能声明一个 void 类型的变量?
- 如果void类型函数什么都不返回会发生什么
- 在声明后将int类型强制转换为void类型
- C++ 动态数组:不能使用 "void" 类型的值来初始化 "int" 类型的实体