1

我有一个本机 C++ 程序,它使用“事件队列”在不同线程上执行函数。我在堆上分配了一个“事件”类,并将它放在我的一个线程队列中执行。

这一切都很好,但是很难追溯这些“事件”的起源。我希望每个“事件”都存储一些与其来源有关的信息。现在我使用内在_ReturnAddress()的,但我也想要文件名字符串和行号。我可以使用宏来安排我的“事件”。

当然,我不想为拥有这些字符串付出代价。

有没有办法让预处理器建立并转储以归档“id”=>“file,line”的映射,其中“id”每次我的宏扩展时都会增加一些唯一的数字?我可以将该 ID 存储为我的来源。

或者也许计算一个非常短的文件名哈希,以便我可以在运行时使用它?

欢迎任何想法。

4

3 回答 3

4

对于您可以使用的 ID__COUNTER__.

来自http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx

展开为一个整数,从 0 开始,每次在编译器中使用时递增 1。

__FILE__并可__LINE__用于跟踪事件的分配位置。

但是为什么要追溯这些事件的起源呢?如果这是出于调试目的,您可能希望在特殊调试模式下将使用 StackWalk64 收集的堆栈跟踪嵌入到您的类中 - 它会为您提供更多有用的信息,而不仅仅是原产地。

于 2009-05-28T15:23:44.027 回答
3

编写自己的预处理器。

不必那么难,只需解析 .cpp 文件并搜索您自己定义的一些语法。找到它时,将文件名和行(预处理器必须计算新行数)附加到某个日志文件。不过,它必须将您自己的宏扩展为 c++。将所有内容写入一个临时文件,然后将其传递给“真正的”编译器。

干杯!

于 2009-05-28T15:32:16.957 回答
1

查看Boost.Preprocessor。它是一组仅包含头文件的宏,用于使用标准 C 预处理器执行强大的功能。

它非常复杂(我没有声称理解它)但我认为它可以做你想做的事。此处此处的文档。

于 2009-05-28T15:55:02.793 回答