Как определить макрос, который можно использовать для регистрации вызовов функций в C? - PullRequest
1 голос
/ 27 октября 2011

Я нашел какой-то код, который оборачивает вызовы функций макросом NAME(),

#define NAME(x) x
...
m_strTemp.Format("x key:0x%X", NAME(a_function)(a_param));

Вопрос в том, как определить макрос NAME (), чтобы он регистрировал вызываемую функцию, используя TRACE().

Что-то вроде #define NAME(x) TRACE("x");x не работает, потому что функции, обернутые макросом NAME (), могут возвращать вещи, и иногда они используются, как в примере выше.

Обратите внимание, это должно работать с компилятором VC ++ 2010.

Ответы [ 5 ]

6 голосов
/ 27 октября 2011

Это, вероятно, будет делать то, что вы хотите:

#define NAME(x) (TRACE(#x), x)

(Обратите внимание, что вы можете заключить обозначение функции в разделы, например. (strlen)("foo") допускается).

1 голос
/ 27 октября 2011

Я не уверен на 100%, как работает TRACE, но я бы хотел направить вас к оператору макросов # .

0 голосов
/ 31 октября 2012

У меня был несколько похожий вопрос, в котором я хотел использовать макросы TRACE Visual Studio 2005 для отображения журналов в окне вывода при использовании отладчика. Однако исходные файлы были исходным кодом C, а не C ++, и при этом они никоим образом не использовали инфраструктуру MFC, поэтому я застрял.

Затем я нашел эту статью Отладка с помощью Visual Studion 2005/2008: ведение журнала и трассировка , в которой описывался сначала макрос TRACE, а затем некоторые другие механизмы. Я выбрал макрос _RPT1 (), который позволяет мне поместить сообщение типа TRACE в окно вывода отладчика Visual Studio в исходном файле на языке C.

Требуется включение заголовочного файла crtdbg.h и, как и различные макросы TRACE, существует несколько различных макросов _RPT в зависимости от количества аргументов.

Это не совсем ответ на этот конкретный вопрос, однако я хотел задокументировать этот способ получения отладочной информации в Visual Studio 2005 как альтернативу макросам TRACE в исходном файле на языке C.

0 голосов
/ 27 октября 2011

Для gcc есть функция под названием gcc function Instrumentation .Это позволяет вам получать уведомления о каждом вызове функции и выполнять действия (например, ведение журнала).Может быть, вы можете импортировать части своего кода в Linux, или, возможно, у VS есть аналогичная опция.

0 голосов
/ 27 октября 2011

Я не уверен, что есть решение вашего общего вопроса (связанного с Аспектно-ориентированным программированием ).

Если вы используете GCC и это недавняя версия (4.6), вы можете рассмотреть возможность создания плагина GCC, который заменил бы некоторые ваши звонки, например, на. последовательность вызовов, которая заменяет внутреннее представление Gimple (внутреннее для GCC) вашей программы, вызов типа x=f(y,z) на последовательность типа debugprint2(y,z); x=f(y,z); debugprint1(z) и т. д. Но это не очень просто для кодирования на C. Вы можете рассмотреть кодирование, использующее GCC MELT (высокоуровневый домен-специфический язык для расширения GCC). Но в любом случае расширение GCC не очень просто и имеет смысл (требуется несколько недель работы), только если ваше приложение достаточно большое

...