Это легко сделать с помощью системы преобразования программ.
DMS Software Reengineering Toolkit является системой преобразования программ общего назначения и может использоваться со многими языками (C #, COBOL, Java, EcmaScript, Fortran, ..), а также, в частности, с C ++.
DMS анализирует исходный код (используя полный язык интерфейса, в данном случае для C ++),
создает абстрактные деревья синтаксиса и позволяет применять шаблоны от источника к источнику для преобразования кода из одной программы на C # в другую с любыми свойствами, которые вы пожелаете. Правило преобразования для точного выполнения указанной вами задачи:
domain CSharp.
insert_trace():function->function
"\visibility \returntype \fnname(int \parametername)
{ \body } "
->
"\visibility \returntype \fnname(int \parametername)
{ Heidigger(\CppString\(\methodname\),
\CppString\(\parametername\),
\parametername);
\body } "
Кавычки (") не являются кавычками C ++; скорее, они являются" доменными кавычками "и указывают, что содержимое внутри кавычек имеет синтаксис C ++ (потому что мы сказали" domain CSharp "). The \ foo нотации являются мета-синтаксисом.
Это правило соответствует AST, представляющему функцию, и переписывает это AST в отслеживаемую форму. Полученный AST затем печатается обратно в исходную форму, которую вы можете скомпилировать. Вам, вероятно, нужны другие правила для обработки других комбинаций аргументов; на самом деле, вы, вероятно, обобщите обработку аргументов, чтобы получить (где это возможно) строковое значение для каждого скалярного аргумента.
Должно быть ясно, что вы можете делать намного больше, чем просто регистрировать с этим, и намного больше, чем просто аспектно-ориентированное программирование, поскольку вы можете выражать произвольные преобразования, а не только действия до и после.