2014-02-26 2 views
-4

У меня есть проект с большим количеством файлов, который я хочу добавить простой команде «printf» для каждой функции, найденной в каждом файле. Поделитесь своими идеями о том, как программно определить функцию.Обнаружение функций с использованием C/C++

+1

По программе, вы имели в виду программу, которая будет сканировать файл кода в виде текста файл? –

+3

Как правило, вам нужно проявить некоторые усилия со своей стороны для других, чтобы помочь вам. –

+0

Что вы хотите вычесть? это имя функции –

ответ

2

В то время как я ненавижу быть , что парень и сразу сказать вам, что вы делаете это неправильно, и я понятия не имею, что вы на самом деле хотите выполнить с этим (не задумываясь о дальнейшем объяснении?), вы получите гораздо больше информации о своем коде с помощью отладчика или профилировщика. Если вы хотите увидеть все вызовы функций, ведущие к некоторому событию в вашей программе (например, сбой), попробуйте gdb. Если вы хотите узнать, как часто вызывается функция, посмотрите на что-то вроде Valgrind или gprof. Следующий вопрос идет подробно о профилирование C++:

What can I use to profile C++ code in Linux?

Но, если вы действительно намерены получить Printf в каждой функции, я хотел бы использовать сторонний инструмент, который делает C++ синтаксический. Попытка написать регулярные выражения для синтаксического анализа C++ сама по себе будет упражнением в расстройстве.

CScope - это, пожалуй, самое простое решение «с полки»: http://cscope.sourceforge.net/ Обратите внимание, что это может иметь проблемы с C++-кодом, который тяжел при программировании шаблонов.

Если вы хотите инвестировать в это более серьезное время, разработка решения с помощью компилятора clang с открытым исходным кодом позволит вам сделать что-то действительно всеобъемлющее. Проверьте http://clang.llvm.org/

пример чего-то на стадионах того, что вы делаете: Get list of methods in class using clang

Надежда, которая помогает ...

+0

Помимо шаблонов, лямбда также будет интересна для CScope. – MSalters

1

__FUNCTION__ и __LINE__ макрос. Надеюсь, что это будет полезно

#define PRINT_FUNC_NAME() do{printf("Entered the function %s in line no %d",__FUNCTION__,__LINE__)}while(0) 

Пример программы

#include<iostream> 
using namespace std; 
#define PRINT_FUNC_NAME() do {printf("Entered the function %s in line no %d\n",__FUNCTION__,__LINE__) } while(0) 


void callme() 
{ 
    PRINT_FUNC_NAME(); 
} 
int main() 
{ 
    PRINT_FUNC_NAME(); 
     callme(); 
    return 0; 
} 
+1

Никогда не скрывайте ';' внутри макроса. Вместо этого используйте ';' после каждого вызова. Это помогает сделать код доступным для чтения. Также для такого макроса, который явно выполняет функцию, его гораздо легче читать, когда он определяется как функциональный макрос и называется «PRINT_FUNC_NAME()». –

+0

do {printf ("blahblah") l} while (0) часто рекомендуемый метод использования макросов. – Stolas

+0

@JensGustedt Отредактировано согласно вашему предложению. Спасибо –

Смежные вопросы