各位大侠,能不能在函数体内用什么方法得到当前函数的函数名?UP有分

oiq 2003-05-14 09:54:35
rt,我知道,编译后肯定是得不到函数名的,我说的是能不能用宏处理
在编译之前就得到函数名,然后填充到代码中。
...全文
87 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
tonnyue 2003-05-14
  • 打赏
  • 举报
回复
关注
GoldenSword 2003-05-14
  • 打赏
  • 举报
回复
在每个函数中加上一句纪录"执行到XXXX函数"的语句,然后输出到文件中。
Panr 2003-05-14
  • 打赏
  • 举报
回复
[估计这样可以的]


1:在stdafx.h 中加:
static void PushFuncName(LPCTSTR pcszFuncName);
static void PopupFuncName(LPCTSTR pcszFuncName);
#define BEGIN_FUNC_PROCESS(func) PushFuncName(GET_FUNC_NAME(func))
#define END_FUNC_PROCESS(func) PopupFuncName(GET_FUNC_NAME(func))
//不需此功能时用以下声明
//#define BEGIN_FUNC_PROCESS(func)
//#define END_FUNC_PROCESS(func)


2:在stdafx.cpp 中加:
static CStringArray s_saCallStack;
static void PushFuncName(LPCTSTR pcszFuncName)
{
if (NULL==pcszFuncName)
return ;

s_saCallStack.Add (pcszFuncName);
return ;
}

static void PopupFuncName(LPCTSTR pcszFuncName)
{
if (NULL==pcszFuncName)
return ;

const int nSizeJust = s_saCallStack.GetSize ();
CString strPopup(pcszFuncName);
CString strTemp;
if (0 == nSizeJust)
{
::AfxMessageBox (_T("Begin/EndFuncProcess未匹配"), MB_OK);
return ;
}

strTemp = s_saCallStack.GetAt (nSizeJust - 1);
if (strTemp == strPopup)
{
s_saCallStack.RemoveAt (nSizeJust-1);
return ;
}

// pcszFuncName 不是s_saCallStack 的最后一项
// 可能是被try-throw-catch 出来了
// 可能是有函数的Begin/EndFuncProcess未匹配
int nTemp = nSizeJust-1;
CString strStack, strPrompt;
while (strTemp != strPopup)
{
strStack = strTemp + _T("\r\n") + strStack;
nTemp--;
if (nTemp < 0)
break ;

strTemp = s_saCallStack.GetAt (nTemp);
};

strPrompt.Format (_T("函数调用从第 %d层跳转到了%d层,其中的栈为:%s"), nSizeJust, nTemp, strStack);
::AfxMessageBox (strPrompt, MB_OK);
return ;
}



3:在每个函数的头尾部加入:
BEGIN_FUNC_PROCESS(FuncName);
END_FUNC_PROCESS(FuncName);
例如:
BOOL CGfhhhytytApp::InitInstance()
{
BEGIN_FUNC_PROCESS(InitInstance);

AfxEnableControlContainer();
...


END_FUNC_PROCESS(InitInstance);
}
Panr 2003-05-14
  • 打赏
  • 举报
回复
在每个类中加上类似代码(偶的类名为CGfhhhytytApp):


头文件中:
typedef const void (CGfhhhytytApp::*typeIDFunc)(void);
static LPCTSTR LookupFuncName(typeIDFunc idFunc);


实现文件中:
#define DEFINE_FUNC_REC(func) {(typeIDFunc)func, #func}
#undef GET_FUNC_NAME
#define GET_FUNC_NAME(func) LookupFuncName((typeIDFunc)func)
LPCTSTR CGfhhhytytApp::LookupFuncName(typeIDFunc idFunc)
{
class CFuncInforHolder
{
public:
typeIDFunc m_idFunc;
LPCTSTR m_pcszName;
};

//写该类中所有的可能要查询的函数
CFuncInforHolder mapFunc[] =
{
DEFINE_FUNC_REC(InitInstance),
DEFINE_FUNC_REC(LookupName),
DEFINE_FUNC_REC(LookupName),
};


for (int nIndex=sizeof(mapFunc)/sizeof(*mapFunc)-1; nIndex>=0; nIndex--)
{
if (idFunc == mapFunc[nIndex].m_idFunc)
return mapFunc[nIndex].m_pcszName;
}
return NULL;
}
oiq 2003-05-14
  • 打赏
  • 举报
回复
To laststruggle:
我不仅要类名,还要当前函数名!
loopyifly 2003-05-14
  • 打赏
  • 举报
回复
...


laststruggle 2003-05-14
  • 打赏
  • 举报
回复
你参考一下《深入浅出mfc》中的动态运行时类识别,或许有些帮助
oiq 2003-05-14
  • 打赏
  • 举报
回复
对,就是实现VC调试状态下CallStack窗口。
但我的程序已经release且不在调试状态下。

我看见国内的一个产品实现过这个功能,但不知怎么实现,
Panr 2003-05-14
  • 打赏
  • 举报
回复
如果有断点的话,打开“Call Stack”窗体
oiq 2003-05-14
  • 打赏
  • 举报
回复
我要做的是需要将发生异常时系统的调用堆全部列出来,从WINMAIN开始列,一直到
异常发生函数的函数名全部列出来。
我现在要做的是用一个宏来实现它,但我不可能要类体系的用户输入函数名吧,所以
干脆一个宏,它能自动得到当前函数名,并记录下来。

或者还有其它的方法实现我的功能,请高人赐教~!
zhang865 2003-05-14
  • 打赏
  • 举报
回复
一楼说的方法不好么!?

把你的原因说出来
kangfx 2003-05-14
  • 打赏
  • 举报
回复
up
jackingod 2003-05-14
  • 打赏
  • 举报
回复
哦!
new problem,new answer!
winkiky 2003-05-14
  • 打赏
  • 举报
回复
能不能把你要这样做的原因贴出来????
Panr 2003-05-14
  • 打赏
  • 举报
回复
估计先用宏定义了以后是可以的
没试过
nlstone 2003-05-14
  • 打赏
  • 举报
回复
能不能把你要这样做的原因贴出来?
alfwolf 2003-05-14
  • 打赏
  • 举报
回复
呵呵,你可以在函数的返回参数中直接带
不过你这样做有意义吗?你通过什么调用函数的?
uhlan 2003-05-14
  • 打赏
  • 举报
回复
楼上所言有道理!
edrftgyh 2003-05-14
  • 打赏
  • 举报
回复
很新鲜,帮你UP
Linux2001 2003-05-14
  • 打赏
  • 举报
回复
何必如此,每个函数体内定义一个字符串变量,里面存放这个函数的函数名称,需要的时候就调用这个字符串变量就可以啦
加载更多回复(4)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧