我正在努力学习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) () {
...
}
然而,我不明白为什么会影响它,这不是我能够改变测试的东西。有任何想法吗?