c++ - odile - visual studio community
reemplace los comentarios del estilo C por los comentarios del estilo C++ (12)
¿Cómo puedo reemplazar automáticamente todos los comentarios del estilo C (/ * comment * /) por comentarios al estilo C ++ (// comment)? Esto tiene que hacerse automáticamente en varios archivos. Cualquier solución está bien, siempre y cuando funcione.
¿Cómo pretendes manejar situaciones como esta?
void CreateExportableDataTable(/*[out, retval]*/ IDispatch **ppVal)
{
//blah
}
Tenga en cuenta el comentario dentro de los parens ... esta es una forma común de documentar cosas en código generado, o mencionar valores de parámetros predeterminados en la implementación de una clase, etc. Por lo general, no soy partidario de tales usos de comentarios, pero son comunes y necesitan ser considerados. No creo que pueda convertirlos a comentarios de estilo C ++ sin pensarlo un poco.
¿Por qué no escribes una aplicación C para analizar sus propios archivos fuente? Puede encontrar los / * comentarios * / secciones con una consulta Regex relativamente fácil. Luego puede reemplazar los nuevos caracteres de línea con un nuevo carácter de línea + "//".
De todos modos, solo un pensamiento. Buena suerte con eso.
Aquí hay una secuencia de comandos de Python que (en su mayoría) hará el trabajo. Maneja la mayoría de los casos extremos, pero no maneja caracteres de comentarios dentro de cadenas, aunque eso debería ser fácil de corregir.
#!/usr/bin/python
import sys
out = ''''
in_comment = False
file = open(sys.argv[1], ''r+'')
for line in file:
if in_comment:
end = line.find(''*/'')
if end != -1:
out += ''//'' + line[:end] + ''/n''
out += '' '' * (end + 2) + line[end+2:]
in_comment = False
else:
out += ''//'' + line
else:
start = line.find(''/*'')
cpp_start = line.find(''//'')
if start != -1 and (cpp_start == -1 or cpp_start > start):
out += line[:start] + ''//'' + line[start+2:]
in_comment = True
else:
out += line
file.seek(0)
file.write(out)
Esta herramienta hace el trabajo: http://people.sc.fsu.edu/~burkardt/cpp_src/recomment/recomment.html
RECOMMENT es un programa en C ++ que convierte los comentarios del estilo C en comentarios al estilo C ++.
También maneja todos los casos no triviales mencionados por otras personas:
Este código incorpora sugerencias y codificación proporcionadas el 28 de abril de 2005 por Steven Martin de JDS Uniphase, Melbourne Florida. Estas sugerencias permiten que el programa ignore los contenidos internos de las cadenas (que de lo contrario podrían comenzar o terminen los comentarios), manejar las líneas de código con los comentarios finales y manejar los comentarios con los bits finales del código.
Este no es un problema trivial.
int * /* foo
/* this is not the beginning of a comment.
int * */ var = NULL;
¿Con qué quieres reemplazar eso? Cualquier sustitución real requiere a veces líneas divisorias.
int * // foo
// this is not the beginning of a comment.
// int *
var = NULL;
Estoy con la gente que comentó en tu pregunta. ¿Por que hacerlo? Solo déjalo.
Pierde el tiempo, agrega commits inútiles al control de versiones, riesgo de arruinar
EDITAR: Agregar detalles de los comentarios de la OP
La razón fundamental para preferir el comentario al estilo de C ++ es que puede comentar un bloque de código que puede contener comentarios. Si ese comentario está en estilo C, este bloque-comentario-salida de código no es directo. - desconocido (yahoo)
eso podría ser algo aceptable / bueno que quiero hacer, pero tengo dos comentarios al respecto:
- No conozco a nadie que defienda cambiar todo el código existente, es decir, una preferencia por el nuevo código. (IMO)
- Si siente la necesidad de "comentar el código" (otra práctica dudosa), puede hacerlo según sea necesario, no antes
También parece que quieres usar los comentarios estilo c para bloquear una sección de código. ¿O vas a usar // para bloquear muchas líneas?
Una alternativa es un preprocesador #ifdef para esa situación. Me avergüenzo de eso, pero es tan malo como comentar líneas / bloques. Ninguno debe quedar en el código de producción.
Hay algunas sugerencias que le gustaría probar:
a) Escriba su propio código (C / Python / cualquier idioma que desee) para reemplazar los comentarios. Algo parecido a lo que dijo Regex o que esta solución ingenua podría funcionar: [Se excluyen casos como el del rmeador, Darron publicó]
for line in file: if line[0] == "/*": buf = ''//'' + all charachters in the line except ''/*'' flag = True if flag = True: if line ends with ''*/'': strip off ''*/'' flag = False add ''//'' + line to buf
b) Encuentra una herramienta para hacerlo. (Buscaré algunos y publicaré, si los encuentro).
c) Casi todos los IDE modernos (si está utilizando uno) o editores de texto tienen una función de comentario automático. A continuación, puede abrir manualmente cada archivo, seleccionar líneas de comentarios, decidir cómo manejar la situación y comentar el estilo de C ++ utilizando un acelerador (por ejemplo, Ctrl + M). Luego, simplemente puede ''Buscar y reemplazar'' todo "/ *" y "* /", una vez más, utilizando su criterio. Tengo Gedit configurado para hacer esto usando el complemento "Comentario de código". No recuerdo cómo lo hice en Vim. Estoy seguro de que este se puede encontrar fácilmente.
Si escribe una aplicación / secuencia de comandos para procesar los archivos de origen C, aquí hay algunas cosas de las que debe tener cuidado:
- Comentar caracteres dentro de cadenas
- Comenta caracteres en el medio de una línea (es posible que no quieras dividir la línea de código)
Es mejor que intentes encontrar una aplicación que entienda cómo analizar realmente el código como código.
Si solo hay "varios archivos", ¿es realmente necesario escribir un programa? Abrirlo en un editor de texto podría hacer el truco más rápido en la práctica, a menos que haya una gran cantidad de comentarios. emacs tiene un comando de comment-region
que (como era de esperar) comenta una región, por lo que sería solo un caso de abandono de la ofensa ''/ *'' y ''* /''.
Muy vieja pregunta, lo sé, pero acabo de lograr esto usando "emacs puros". En resumen, la solución se ve de la siguiente manera:
Ejecute Mx query-replace-regexp
. Cuando se le solicite, ingrese
//*/(/(./|^J/)*?/)*/*/
como la expresión regular para buscar. La ^J
es una línea nueva, que puede ingresar presionando ^Q
(Ctrl + Q en la mayoría de los teclados), y luego presionando la tecla enter. Luego ingrese
///,(replace-regexp-in-string "[/n]//([ ]*?//) //([^ ]//)" "/n//1// //2" /1))
como la expresión de reemplazo.
Básicamente, la idea es usar dos búsquedas de expresiones regulares anidadas. El principal simplemente encuentra comentarios al estilo C (la *?
Repetición ansiosa es muy útil para esto). Luego, una expresión elisp se usa para realizar un segundo reemplazo dentro del texto del comentario solamente . En este caso, estoy buscando nuevas líneas seguidas de espacio, y reemplazando los últimos tres caracteres espaciales por //
, lo que es bueno para preservar el formato de los comentarios (sin embargo, funciona siempre que todos los comentarios tengan sangría).
Los cambios en la expresión regular secundaria harán que este enfoque funcione en otros casos, por ejemplo
///,(replace-regexp-in-string "[/n]" " " /1))
simplemente colocará todo el contenido del comentario original en un solo comentario al estilo de C ++.
de la convención del equipo de PHP ... debe haber algún razonamiento si se formula la pregunta. Solo responde si sabes.
Nunca use comentarios de estilo C ++ (es decir, // comentario). Siempre use comentarios estilo C en su lugar. PHP está escrito en C y su objetivo es compilar bajo cualquier compilador compatible con ANSI-C. Aunque muchos compiladores aceptan comentarios al estilo de C ++ en código C, debes asegurarte de que tu código se compile también con otros compiladores. La única excepción a esta regla es el código que es específico de Win32, porque el puerto Win32 es específico de MS-Visual C ++, y se sabe que este compilador acepta comentarios de estilo C ++ en código C.
Recientemente convertí todos los comentarios estilo C al estilo C ++ para todos los archivos en nuestro repositorio. Como no podía encontrar una herramienta que lo hiciera automáticamente, escribí la mía: c-comments-to-cpp
No es infalible, pero mucho mejor que cualquier otra cosa que haya intentado (incluido RECOMENDACIÓN). Entre otras cosas, admite la conversión de comentarios al estilo Doxygen, por ejemplo:
/**
* @brief My foo struct.
*/
struct foo {
int bar; /*!< This is a member.
It also has a meaning. */
};
Se convierte a:
/// @brief My foo struct.
struct foo {
int bar; ///< This is a member.
///< It also has a meaning.
};