我有什么方法可以在代码中显式调用通常在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 );


但是这里需要非常了解-我们做什么以及为什么要做

关于c++ - 如何显式调用CRT启动功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46331874/

10-13 08:15