Joe*_*oel 4 c++ dll code-generation stdio
我有一个C++框架,其中一些计算被委托(有时自动生成)C函数或C++函数与外部"C"链接.这些是低级例程,必须以非常快的速度进行评估并且开销最小,并且它们通常驻留在单独的共享对象/ DLL中.他们目前的签名是这样的:
int my_generated_function(const double* input, double* output, double* work);
Run Code Online (Sandbox Code Playgroud)
它将驻留在使用dlopenPOSIX或LoadLibraryWindows 加载的共享库中.使用dlsym(handle, "my_generated_function")POSIX或GetProcAddress(handle, TEXT("my_generated_function"))Windows 提取相应的函数指针.
使用FILE对象指针增强签名是否安全且可移植?
int my_generated_function(const double* input, double* output, double* work,
FILE* logfile);
Run Code Online (Sandbox Code Playgroud)
请注意,包含的共享对象my_generated_function可能已使用与加载共享对象的代码不同(但二进制兼容)的编译器进行编译.
您可以将其FILE*视为不透明的句柄.问题是此句柄下的实际对象,换句话说,FILE结构的定义及其实现细节是编译器/ CRT特定的.
因此,据我所知,不能保证Visual Studio 2008或2010的FILE实现与VS2015或2017中的FILE实现相同.换句话说,即使结构的名称(FILE)是相同的,实施细节可能会从一个版本的CRT变为另一个版本.
所以,我建议不具有FILE*在DLL边界,除非你想限制你的客户端使用相同的VC++编译器/ CRT的版本.
另一方面,如果你需要DLL接口边界的交叉编译器/ CRT兼容句柄,我建议使用Win32 HANDLE类型(从API返回的类型CreateFile).这是在OS级别定义的,因此它独立于特定的VC++编译器/ CRT.
如果你想获得的Win32 HANDLE从FILE*,你可以用_get_osfhandle用_fileno,在解释这个苏答案.
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |