Нет поддержки многострочных MACRO во время трассировки WPP - PullRequest
2 голосов
/ 21 января 2011

Я добавляю трассировку в приложение пользовательского режима на основе «Event Tracing for Windows» (ETW) с использованием WPP (препроцессор) и компилятора Visual Studio.

Это MSDN-контент объясняет, как конвертировать существующие макросы, чтобы разрешить трассировку из них.Примером является CHECK_HR, который получает один аргумент (HR) и генерирует трассировку, если он не равен 0.

Теперь я обнаружил, что сгенерированная функция препроцессора не работает, если аргумент multi, из-за того, как работает WPP.Но я не смог найти ссылку на такую ​​проблему!

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

Проблема в том, что когда макрос встречается препроцессором в строке 17 файла.cpp wpp, он генерирует функцию, называемую что-то вроде wpp_File_cpp17и использует LINE , чтобы вызвать его из макроса.Но для многострочного макроса, как указано выше, __LINE__ будет 18, и вы получите сообщение об ошибке:

wpp_File_cpp18: unknown function

Есть ли у кого-нибудь решение этой проблемы?Я знаю, что MSFT широко использует WPP внутри страны, мне интересно, как они справляются с этим ...

1 Ответ

0 голосов
/ 02 июля 2012

Я пытался воспроизвести эту проблему, но безуспешно - многострочные вызовы WPP работают для меня, поэтому полученная вами ошибка кажется странной.Вы каким-либо образом модифицировали макрос CHECK_HR?

Вы можете попробовать поставить косую черту в конце каждой строки вызова:

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

Кроме того, в вашем примере вам не хватает закрывающей скобки, это вызывает WPP_CALL_blahblah_undefined.Но, скорее всего, это просто опечатка в этом примере.

...