2010-10-22 24 views
9

Tengo un archivo fuente C que tiene comentarios en el estilo // (C++). Quiero cambiar todos los comentarios al antiguo estilo /* */ (C). ¿Hay alguna manera de hacer esto usando un script existente?Cambiando los comentarios del estilo C++ al estilo C

+1

¿Está utilizando una versión de C anterior a C99? Según mi experiencia y la página wiki (http://en.wikipedia.org/wiki/C_(programming_language)) los comentarios de estilo '//' están permitidos C99 en adelante. Si el estándar de codificación tiene algún límite en la longitud de la línea (por ejemplo, Google Coding Style recomienda un máximo de 80 caracteres), también debes tener cuidado con eso. Puede haber casos como lo que pmg menciona a continuación. En general, tengo curiosidad por saber cuál es tu motivación. – Arun

+2

Una buena razón para hacer esto es obtener código para compilar limpiamente con compiladores que no admiten comentarios de estilo de C++ o quejarse de ellos con la versión específica de C especificada. – nategoose

+0

Se espera que escriba un código que cumpla con ANSI tanto como sea posible. Así que estoy marcando todos los errores que 'gcc -ansi' está apareciendo. –

Respuesta

14

Una sustitución contigo editor favorito y una expresión regular, como debe hacerlo s#//(.*)#/*\1 */# ...

+1

Solo preste atención a 'x = 0; ///* era x = 1; */off-by-one error corregido' – pmg

+0

no funciona para mí en vi (arroja 'Patrón no encontrado: //(.*)') ¿Qué hace hash? –

+2

@N 1.1: El hash es solo un marcador de posición, puede ser cualquier carácter. Por lo general, es una barra diagonal, pero cuando tienes barras en tu patrón, es más fácil usar un delimitador diferente de lo que es para escapar de todas tus barras diagonales. 's/foo/bar /' es equivalente a 's # foo # bar #', 'sXfooXbarX', y' s, foo, bar, 'etc. –

1

Desafortunadamente la mayoría de las secuencias de comandos sólo funcionará al revés. Hay uno decente llamado "RECOMEND", pero toma C y se convierte a los comentarios más nuevos del estilo de C++. Me imagino que su razón para querer hacer esto se debe a los errores del compilador con los comentarios de estilo C++. La causa habitual de esto es una línea que utiliza un comentario estilo C con un comentario de estilo C++. Quizás buscar ese escenario en particular eliminaría su necesidad de volver a convertirlo en comentarios de estilo más antiguo. Si no, lamentablemente deberías hacerlo a mano. (Oro para que no lo hace ya que sé lo tedioso que puede ser!)


recomiendo Enlace: http://people.sc.fsu.edu/~jburkardt/cpp_src/recomment/recomment.html

+0

Lo tendré en cuenta cuando lo necesite. Es posible que desee proporcionar un enlace a RECOMENDACIÓN en su respuesta. –

+1

Los scripts que hacen esto al revés son aterradores. '/ * foo */bar ++;' no se puede traducir correctamente sin cambiar la numeración de líneas. – nategoose

+0

¡Me disculpo por olvidar el enlace! ¡He actualizado mi respuesta con el enlace en la parte inferior! –

4

Si usted está buscando algo un poco más genérica, también se puede utilizar una herramienta de formateo de código fuente para esto. Para C, he usado uncrustify anteriormente y funcionó razonablemente bien. También puede haber otros, pero creo que la opción no crítica puede cambiar los comentarios del estilo C++ en comentarios del estilo C con el parámetro cmt_cpp_to_c.

La configuración puede ser un poco intimidante, pero si solo usa el archivo de configuración de ejemplo y cambia solo las cosas que le interesan, podría hacer lo que quiera.

1

Puede hacerlo con el complemento Vim Nerdcommenter.

Esto hace que sea fácil descomentar el texto y luego agregar un comentario de varias líneas como desee.

1

Bueno, 1,$s#//\(.*\)#/*\1 */# funcionará solo si no tiene instancias de comentarios en estilo C++ dentro de (normalmente multilíneas) comentarios al estilo C, ya que la sustitución finalizará prematuramente el comentario al estilo C, dejando la porción restante del Comentario de tipo C sin inicio /*.

Cualquier comentario regular de estilo C++ que tenga */ dentro de él también causará problemas. Esto sucede en el código donde un programador incorrecto cambió un comentario de estilo C a un comentario de estilo C++ sin eliminar la terminación */.

1

Este es un problema simple en la superficie, pero un problema muy difícil para manejar todos los casos extremos. La solución más sencilla es fácil de implementar en la sed:

sed -e 'sX// *\(.*[^ ]\) *$X/* \1 */X' <oldfile> newfile 

Se puede ajustar según sea necesario que: Tengo que comer todos los espacios al principio y al final del comentario.

Lo que no se soluciona son los comentarios de estilo nuevo con comentarios incrustados al estilo antiguo (como han señalado otros). Lo que esto realmente arruina es cadenas con doble barra - no son comentarios, pero sin analizar las cadenas, se verán modificados como si lo fueran. Verifique los siguientes:

egrep '//.*/[*]|".*//' oldfile 

Si tocas cualquiera de ellos, necesitarán una corrección manual. Cualquier intento de automatizarlo sin analizar realmente el archivo solo creará nuevas y más intrincadas condiciones de borde, aunque es posible que reconozca un patrón para un truco que sea lo suficientemente bueno para su situación.

Cuestiones relacionadas