有什么方法可以在我的代码中显式调用 mainCRTStartup 函数中通常调用的函数?我对initterm和initterm_e函数特别感兴趣。即使我的程序与 crt 链接(它必须是,对吗?)我不能只调用 initterm - 我试图声明并调用,但我得到了未定义的引用。
有什么办法吗?
有什么方法可以在我的代码中显式调用 mainCRTStartup 函数中通常调用的函数?我对initterm和initterm_e函数特别感兴趣。即使我的程序与 crt 链接(它必须是,对吗?)我不能只调用 initterm - 我试图声明并调用,但我得到了未定义的引用。
有什么办法吗?
_initterm和_initterm_e(msdn 中的注释声明_initterm_e
错误 - 实际上它使用_PIFV
的类型)由不同的 CRT dll 导出。它也在 lib 文件中声明。这个功能的实现非常简单:
typedef void (__cdecl *_PVFV)();
void _initterm(const _PVFV *ppfn, const _PVFV *end)
{
do
{
if (_PVFV pfn = *++ppfn)
{
pfn();
}
} while (ppfn < end);
}
typedef int (__cdecl *_PIFV)();
int _initterm_e(const _PIFV *ppfn, const _PIFV *end)
{
do
{
if (_PIFV pfn = *++ppfn)
{
if (int err = pfn()) return err;
}
} while (ppfn < end);
return 0;
}
所以你可以导入它而不是使用自己的实现。这里更快的问题 - 什么用作输入参数?
说c++(CL编译器如何最小化)使用( ".CRT$XCA", ".CRT$XCZ" )
部分来放置c++全局初始化。所以我们可以做下一步:
extern "C"
{
#pragma const_seg(".CRT$XCA")
const _PVFV __xc_a = 0;
#pragma const_seg(".CRT$XCZ")
const _PVFV __xc_z = 0;
#pragma const_seg(".CRT$XIA")
const _PVFV __xi_a = 0;
#pragma const_seg(".CRT$XIZ")
const _PVFV __xi_z = 0;
}
/*
* do initializations
*/
initret = _initterm_e( &__xi_a, &__xi_z );
if ( initret != 0 )
return initret;
/*
* do C++ initializations
*/
_initterm( &__xc_a, &__xc_z );
但这里需要很好地理解——我们在做什么以及为什么要做