2

我正在使用 WPP(预处理器)和 Visual Studio 编译器向基于“Windows 事件跟踪”(ETW)的用户模式应用程序添加跟踪。

MSDN 内容解释了如何转换现有宏以允许从其中进行跟踪。这里的示例是 CHECK_HR,它获取单个参数 (HR),如果它不为 0,则生成跟踪。

现在,我发现如果参数是多行的,由于 WPP 的工作方式,生成的预处理器函数不起作用。但是我找不到任何有关此类问题的参考!

CHECK_HR(DoSomething(a,b,c)); // works   
CHECK_HR(DoSomething(a,  
    b, c)); // don't work

问题是,当预处理器在 File.cpp wpp 的第 17 行遇到宏时,它会生成一个名为 wpp_File_cpp17 之类的函数,并使用LINE从宏中调用它。但是对于上面的多行宏,__ LINE__ 将是 18 并且会出现错误:

wpp_File_cpp18: unknown function

有没有人有解决这个问题的方法?我知道 MSFT 在内部广泛使用 WPP,我想知道他们如何处理这个......

4

1 回答 1

0

我试图重现这个问题,但没有成功——多行 WPP 调用对我有用,所以你得到的错误似乎有点奇怪。CHECK_HR您是否以任何方式修改了宏?

您可以尝试在调用的每一行末尾添加斜杠:

CHECK_HR(DoSomething(a, \
                     b, \
                     c));

此外,在您的示例中,您缺少右括号,这会导致 WPP_CALL_blahblah_undefined。但很可能这只是这个例子中的一个错字。

于 2012-07-02T14:26:35.137 回答