__FUNCTION__扩展为无效的内存地址

时间:2014-08-27 02:21:03

标签: windows visual-c++

我正在努力学习VC ++的predefined macros.据我所知,__FUNCTION__应该在预处理期间扩展为字符串文字。出于某种原因,当我看到它扩展到的这个地址时,内存是无效的/任意的/未初始化的。但是,如果我调用一个函数,然后在那个框架中使用__FUNCTION__,它就会起作用。

例如,我有这段测试代码:

#if (MODE == USER_MODE)
    PCSTR test = __FUNCTION__;
#endif

在WinDbg中:

0: kd> ?? test
char * 0x00007ff9`a08a7e30
 "--- memory read error at address 0x00007ff9`a08a7e30 ---"
0: kd> db 0x00007ff9`a08a7e60
00007ff9`a08a7e60  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
00007ff9`a08a7e70  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
00007ff9`a08a7e80  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
00007ff9`a08a7e90  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
00007ff9`a08a7ea0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
00007ff9`a08a7eb0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
00007ff9`a08a7ec0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????
00007ff9`a08a7ed0  ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??  ????????????????

如果我然后立即调用一个函数并从那里尝试:

#if (MODE == USER_MODE)
    PCSTR test = __FUNCTION__;
#endif

DavidsTestFunction();

return;
}

VOID
__declspec(noreturn)
DavidsTestFunction()
{
    #if (MODE == USER_MODE)
        PCSTR test = __FUNCTION__;
    #endif    
}

然后按预期工作:

0: kd> ?? test
char * 0x00007ff9`a089c470
"DavidsTestFunction"

我完全难过了。我唯一可以想象的是,因为我们在函数名称周围有一些恶作剧。例如,由于我们从内联存根调用此函数,因此宏更改函数名称以通过类似的方式向其附加“imp_”。

#define OUREXPORTFUNCTION(a) imp_ ## a

...

OUREXPORTFUNCTION(DavidsInitialFunction) () {

    ...

}

然而,我不明白为什么会影响它,这不是我能够改变测试的东西。有任何想法吗?

0 个答案:

没有答案