【发布时间】:2013-05-17 06:23:44
【问题描述】:
我有以下要求:
- 在任何函数的入口和出口点添加文本。
- 不改变源代码,除了从上面插入(所以没有预处理器或任何东西)
例如:
void fn(param-list)
{
ENTRY_TEXT (param-list)
//some code
EXIT_TEXT
}
但不仅在这种简单的情况下,它还可以使用预处理器指令运行!
例子:
void fn(param-list)
#ifdef __WIN__
{
ENTRY_TEXT (param-list)
//some windows code
EXIT_TEXT
}
#else
{
ENTRY_TEXT (param-list)
//some any-os code
if (condition)
{
return; //should become EXIT_TEXT
}
EXIT_TEXT
}
所以我的问题是:有合适的方法吗?
我已经尝试使用编译器使用的解析器进行一些工作,但由于它们都依赖于在解析之前运行预处理器,所以它们对我来说毫无用处。
此外,一些不需要预处理器的令牌生成解析器有些无用,因为它们会生成令牌的内存映射,然后导致完整的新源代码,而不仅仅是插入文本。
我正在做的一件事是尝试使用 FLEX(或 JFlex),如果这是一个有效的选项,我将不胜感激。 ;-)
编辑: 澄清一点:目的是允许堆栈跟踪之类的东西。 我想跟踪每个函数调用,为了遵循调用层次结构,我需要在函数的入口点和函数的出口点放置一个宏。 这构建了一个函数调用跟踪。 :-)
EDIT2:特定于编译器的选项不太合适,因为我们有许多不同的编译器可供使用,而且许多编译器可能没有得到任何工具的良好支持。
【问题讨论】:
-
澄清一下:你想修改每个函数的源代码?
-
是的,c++源代码文件中任何函数的每个入口和出口点都需要标记。
-
这是某种文档吗?
-
你明白了 :-) 检查我的编辑以获得简短的描述!
-
这就是我们有调试器的原因。你可以停下来看看堆栈跟踪。