Como señaló kaptnole, la expresión regular que diseñé podría usarse directamente en el estudio visual. Su patrón es:
^[\ s \ t] * ([a-zA-Z_0-9] ) [\ s \ t] = [\ s \ t] \ 1 [\ s \ t]; [\ s \ t] * $
Siga las instrucciones que figuran en esta lista:
http://msdn.microsoft.com/en-us/library/2k3te2cs%28VS.80%29.aspx
... y hallazgo feliz (sin tener que tocar Perl!).
Este Perl un trazador de líneas lo hará por usted:
perl -n -e'/^[\s\t]*([a-zA-Z_0-9]*)[\s\t]*=[\s\t]*\1[\s\t]*;[\s\t]*$/&&print "$. $_"' test_me && echo
he comprobado en un archivo que contenga la siguiente y se detecta correctamente todos los partidos:
hi = hi;
hi= hi ;
hi=hi ;
salida .. ..
[email protected]% perl -n -e'/[\s\t]*([a-zA-Z_0-9]*)[\s\t]*=[\s\t]*\1[\s\t]*;[\s\t]*$/&&print "$. $_"' test_me && echo
1 hi = hi;
2 hi= hi ;
3 hi=hi ;
[email protected]%
Mi primer thoug ¡Lo haría en Awk, pero aparentemente Awk no guarda sus coincidencias! :(
Pero bueno, este script Perl es muy llamativo en sí ... incluso imprime los números de línea del hallazgo!
EDIT 1
Y para responder a su otra pregunta , Compilé un programa de prueba simple con una asignación dentro de main con los indicadores "-pedantic" y "-Wall" usando gcc y g ++ y tampoco recibí advertencias ... así que supongo que no te avisa de este tipo de redundancia.
Aquí es mi programa de pruebas:
int main (int argc, char *argv[]) {
int bob=5;
bob=bob;
return 0;
}
EDIT 2
Tenga en cuenta mi anterior script de perl no comprueba para ver si hay una variable local de una denominación dentro de una función . En ese caso, la declaración podría ser válida, pero con un estilo pobre (aún podría ser bueno advertirlo).
Y como señala Josh, la bandera "-Wshadow" LE advertirá sobre esto en gcc/g ++ en este caso especializado.
Sugeriría seguir los consejos de Josh sobre el uso de const para argumentos de funciones estáticas. De hecho, cualquier variable no aprobada por referencia generalmente debe ser const
por ej.
void hello_world_print_numbers(int number_1, int number_2, int number_3) {
...
}
es una asignación equivocada a punto de ocurrir, así que en vez de usar:
void hello_world_print_numbers(const int number_1, const int number_2, const int number_3) {
...
}
... Del mismo modo, en general, con los punteros, excepto en el caso de punteros pasados a matrices (y tener cuidado de no pasar en los límites apropiados de la matriz!).
void hello_world_print_numbers(const int * number_1, const int * number_2, const int * number_3) {
...
}
EDITAR 3
me olvidó mi ^
al comienzo de mi expresión regular. Aunque aparentemente trivial, esto hace que etiquete incorrectamente asignaciones del tipo my_class->name=name;
. Esto fue sabiamente señalado por RC. La expresión regular ahora está arreglada y ya no debería tener este problema. Gracias RC!
@Georg ... sería bueno para el compilador para incluir una advertencia de que hay , ya que el código es redundante. Las declaraciones de variables redundantes son advertidas, por lo que este parece ser un caso de advertencia apropiado también. Pero basado en mi prueba g ++/gcc no advierte sobre este tipo de sintaxis. –
@Jason: Sí, no es necesario que me diga eso. Acabo de decir que el cambio que Brian sugiere no cambia nada. –
¿Ha cambiado tanto la base de códigos que no puede revisar los cambios que ha realizado utilizando la solución de diferencias que proporciona su SCM? Por ejemplo, utilizo TortoiseSVN y proporciona una GUI realmente agradable para todos los archivos modificados más una buena herramienta gráfica de diferencias para revisar archivos individuales. (Utiliza un SCM, ¿no?) – sbi