我有一个本机C ++程序,它使用“事件队列”来执行不同线程上的函数。我在堆上分配了一个“event”类,并将它放在我的一个线程队列中以供执行。
这一切都很有效,但要追溯这些“事件”的起源非常困难。我希望每个“事件”都能存储一些与其来源有关的信息。现在我使用内在_ReturnAddress()
,但我还想拥有文件名字符串和行号。我可以使用宏来安排我的“事件”。
当然,我不想为这些字符串付出代价。
有没有办法让预处理器建立并转储到文件的地图 “id”=> “file,line”,每次我的宏扩展时,“id”会增加一些唯一的数字吗?我可以将该ID存储为我的来源。
或者可能计算一个非常短的文件名哈希值,以便我可以在运行时使用它?
欢迎任何想法。
答案 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预处理器执行强大的功能。