如何使用预处理器在编译时计算和存储哈希?

时间:2009-05-28 15:11:08

标签: c++ macros c-preprocessor trace

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

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

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

有没有办法让预处理器建立并转储到文件的地图 “id”=> “file,line”,每次我的宏扩展时,“id”会增加一些唯一的数字吗?我可以将该ID存储为我的来源。

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

欢迎任何想法。

3 个答案:

答案 0 :(得分:4)

对于ID,您可以使用__COUNTER__.

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

  

扩展为以0开头的整数   并且每次增加1   用于compiland。

__FILE____LINE__可用于跟踪事件的分配位置。

但为什么要跟踪这些事件的起源?如果这是出于调试目的,您可能希望在处于特殊调试模式时将堆栈跟踪(使用StackWalk64收集)嵌入到类中 - 它将为您提供比原始位置更多有用的信息。

答案 1 :(得分:3)

编写自己的预处理器。

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

干杯!

答案 2 :(得分:1)

结帐Boost.Preprocessor。它是一个仅限标头的宏集,用于使用标准C预处理器执行强大的功能。

这很复杂(我没有声称理解它),但我认为它可以做你想要的。文档herehere