2009-07-16 17 views
14

Estoy refaccionando algunos códigos en C++, y quiero desaprobar algunos métodos antiguos. Mi método actual para encontrar todos los métodos es el siguiente:¿Cómo encontrar todas las personas que llaman de una función en C++?

  1. Comenta el método original en el archivo fuente en el que estoy trabajando.
  2. Intenta compilar el código.
  3. Si se encuentra un error de compilación, haga una nota para comentar la llamada e intente volver a compilar.
  4. Una vez que la compilación se ha completado con éxito, he encontrado todas las llamadas.

Esto es una mierda. También he intentado grepping fuente para el nombre de las llamadas a funciones, pero a veces me encuentro con problemas con las funciones del mismo nombre con argumentos diferentes, por lo que mi compilación hace que el compilador de C++ resolver los nombres para mí. He encontrado this question para C#, pero mi base de código está completamente implementada en C++.

¿Hay una mejor manera de encontrar todas las personas que llaman de un método o función de clase en C++? Estoy usando GCC en sistemas Unix, pero las soluciones multiplataforma serían superlativas.

+0

Me encantaría saber de una buena solución, pero me parece que tendrías que duplicar toda la interfaz. Eso es más o menos lo que se necesitaría para construir la tabla de símbolos. –

+1

Pruebe [CodeQuery] (https://github.com/ruben2020/codequery). Combina lo mejor de cscope y ctags, para producir una mejor información de código fuente de C++. Descargo de responsabilidad: es mi proyecto de código abierto. – ruben2020

Respuesta

32

GCC le permite decodificar variables, funciones y métodos con __attribute__((deprecated)), lo que provocará una advertencia en todas las listas de llamadas (a menos que se especifique -Wno-deprecated-declarations).

class A { 
public: 
    A() __attribute__((deprecated)) {} 
}; 
int main() { 
    A a; 
} 
 
$ g++ test.c 
test.cc: In function ‘int main()’: 
test.cc:6: warning: ‘A::A()’ is deprecated (declared at test.cc:3) 
+1

Agradable. Como el OQ usa GCC (y no menciona otras plataformas), esto es lo que haría. –

+8

Para cualquiera que use Visual Studio, existe una funcionalidad similar con #pragma obsoleto (nombre de función). Ver http://msdn.microsoft.com/en-us/library/044swk7y.aspx – Eclipse

+0

Esta es la respuesta correcta para mí, porque estoy refactorizando No necesitaré que los atributos sean multiplataforma. ¡Buen material! –

2

Así es como lo hago. Si tu código está en una sola ubicación, un "grep" (o find | grep combo) también puede ser el truco.

One caviat: Este método muy a menudo fallará las instancias que no están compiladas condicionalmente en su configuración actual. Si su código utiliza #ifdefs para admitir configuraciones múltiples, una persona completa intentará compilar con cada configuración para capturar todas las instancias.

+0

Ese es un buen punto. Afortunadamente, no tenemos muchos ifdef en nuestro código, y no espero muchos para este proyecto de refactorización en particular, pero esa es otra razón por la que necesito un truco mejor. :) –

4

Creo que lo que desea es buscar en una gráfica llamada. Vea this question para algunas buenas sugerencias sobre cómo hacer eso.

+0

¡Gracias por el enlace! No vi esa pregunta en mi búsqueda. –

6

Una opción es ejecutar todo su proyecto a través de un programa como Cscope. Que esencialmente analiza el código fuente completo de su proyecto y crea una base de datos que permite buscar fácilmente cosas como todas las llamadas de una función, todas las referencias, etc.

Sé que funciona bastante bien para C, y lo afirman funciona decentemente para C++. KScope es una interfaz gráfica de usuario de KDE para él.

+2

Drat. Tenía esperanzas hasta que leí su "dicen que funciona decentemente para C++". Según tu publicación, pensé que hablabas de primera mano. Soy un gran fan de cscope por código C, incluso código C grande y complejo, pero he tenido resultados muy diversos con C++. Creo que en lugar de lamentarme, debería intentar arreglar cscope, ya que está en Sourceforge después de todo ... – Dan

4

Para cualquiera que desee hacer esto en Visual Studio en Windows ....

ayuda visual es muy bueno. Ayuda mucho con muchas refactorizaciones de C++, gráficos de llamadas, cambio de nombre, creación automática de definiciones de encabezado o métodos de generación a partir de definiciones, etc. No es perfecto, nada como la calidad de las herramientas de refactorización de Java/C#, ¡pero es realmente bueno para C++!

10

Eclipse puede hacerlo sin ningún complemento. Puede ser una herramienta útil para cosas como esta, incluso si no desea usarlo para su editor diario.

  1. Descargue, instale y ejecute Eclipse CDT.
  2. Vaya a Archivo, Nuevo, Proyecto C++. Ingrese el nombre de un proyecto y elija un proyecto Empty Makefile desde la vista de árbol del tipo de proyecto. Desmarque "Usar ubicación predeterminada" e ingrese la carpeta donde se guarda su proyecto.
  3. Haga clic en Siguiente y luego en Finalizar.
  4. Eclipse comenzará automáticamente a indexar su proyecto. Si realmente es un proyecto Makefile, y dado que está usando g ++, puede hacer una limpieza completa y luego crear desde Eclipse (en el menú Proyecto), y debe usar automáticamente sus archivos make existentes y descubrir automáticamente sus directorios de inclusión y otros configuración del proyecto.
  5. Encuentra el prototipo de la función sobrecargada en un archivo fuente, haz clic con el botón derecho en él, elige Referencias y elige Proyecto. Eclipse encontrará todas las referencias a esa función, y solo a esa sobrecarga particular de esa función, dentro de su proyecto.

También puede usar el soporte de refactorización incorporado de Eclipse para cambiar el nombre de las funciones sobrecargadas para que ya no se sobrecarguen. Eclipse también es completamente multiplataforma; puede usar características como su indexador, referencias de búsqueda y refactorización incluso para proyectos que se mantienen y construyen en otros IDEs.

+1

Simul-respondió! Me inclino por su respuesta más completa y lo recompenso con un voto positivo :-) –

2

Si permite que el Eclipse CDT indexe su base de origen, entonces debería poder ver la jerarquía de llamadas para cualquier función e incluso realizar algunas refactorizaciones.

Puede download Eclipse IDE para C/C++ Developers (con suerte puede encontrar un puerto para su particular * NIX) y seguir su instructions para continuar.

2

En Visual Studio, haga clic en el nombre de la función y haga clic en "Explorador de llamadas"> gráfico muestran personas que llaman

Luego, en la ventana de visualización debería haber una carpeta llamada "llamadas a funcionar" que contiene todos los lugares que llame a esa función, cada una de las cuales puede hacer doble clic para ir a ellas en el código.

+0

En compilaciones más recientes de VS, el elemento de menú contextual se denomina Jerarquía de llamadas. –

+0

En VS 2013 parece ser View Call Hierachy. – Watusimoto

Cuestiones relacionadas