Заменить комментарии в стиле C комментариями в стиле C ++ - PullRequest
7 голосов
/ 12 февраля 2009

Как я могу автоматически заменить все комментарии в стиле C (/* comment */) на комментарии в стиле C ++ (// comment)?

Это должно быть сделано автоматически в нескольких файлах. Любое решение в порядке, пока оно работает.

Ответы [ 12 ]

17 голосов
/ 12 февраля 2009

Этот инструмент выполняет работу: http://people.sc.fsu.edu/~burkardt/cpp_src/recomment/recomment.html

RECOMMENT - это программа на C ++, которая преобразует комментарии в стиле C в стиль C ++ комментарии.

Он также обрабатывает все нетривиальные случаи, упомянутые другими людьми:

Этот код включает в себя предложения и кодирование, предоставленное 28 апреля 2005 г. Стивен Мартин из JDS Uniphase, Мельбурн Флорида. Эти предложения разрешить программе игнорировать внутреннее содержимое строк, (которое в противном случае может показаться, начало или конец комментарии), для обработки строк кода с последними комментариями, и обрабатывать комментарии с последними битами кода.

12 голосов
/ 12 февраля 2009

Это не тривиальная проблема.

int * /* foo 
  /* this is not the beginning of a comment.

int * */ var = NULL;

Чем вы хотите заменить это? Любая реальная замена требует иногда разделения строк.

int * // foo
  // this is not the beginning of a comment.
// int *
var = NULL;
5 голосов
/ 12 февраля 2009

Как вы собираетесь обрабатывать ситуации, подобные этой:

void CreateExportableDataTable(/*[out, retval]*/ IDispatch **ppVal)
{
 //blah
}

Обратите внимание на комментарий внутри паренов ... это распространенный способ документирования вещей в сгенерированном коде или упоминания значений параметров по умолчанию в реализации класса и т. Д. Я обычно не фанат такого использования комментариев , но они являются общими и должны быть рассмотрены. Я не думаю, что вы можете конвертировать их в комментарии в стиле C ++, не задумываясь.

4 голосов
/ 12 февраля 2009

Я с людьми, которые прокомментировали ваш вопрос. Зачем это делать? Просто оставь это.

это тратит время, добавляет бесполезные коммиты в контроль версий, риск испортить

EDIT: Добавление деталей из комментариев от ОП

Основная причина предпочтения комментариев в стиле C ++ состоит в том, что вы можете закомментировать блок кода, в котором могут быть комментарии. Если этот комментарий выполнен в стиле C, этот блок-комментарий кода не является прямым. - неизвестно (Yahoo)

это может быть неплохо, но у меня есть два комментария по этому поводу:

  • Я не знаю никого, кто бы выступал за изменение всего существующего кода - это предпочтение для нового кода. (ИМО)
  • Если вы чувствуете необходимость «закомментировать код» (еще одна сомнительная практика), вы можете сделать это по мере необходимости - не раньше

Также кажется, что вы хотите использовать комментарии в стиле c, чтобы заблокировать часть кода? Или вы собираетесь использовать //, чтобы заблокировать много строк?

Одной из альтернатив является препроцессор #ifdef для этой ситуации. Я съеживаюсь от этого, но это так же плохо, как комментировать строки / блоки. Ни один не должен быть оставлен в производственном коде.

2 голосов
/ 12 февраля 2009

Вот скрипт Python, который (в основном) сделает эту работу. Он обрабатывает большинство крайних случаев, но не обрабатывает символы комментариев внутри строк, хотя это легко исправить.

#!/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)
1 голос
/ 17 января 2017

Я недавно преобразовал все комментарии в стиле C в стиль C ++ для всех файлов в нашем хранилище. Поскольку я не мог найти инструмент, который бы делал это автоматически, я написал свой собственный: c-comments-to-cpp

Это не надежно, но гораздо лучше, чем все, что я пробовал (включая РЕКОМЕНДАЦИЮ). Помимо прочего, он поддерживает преобразование комментариев в стиле Doxygen, например:

/**
* @brief My foo struct.
*/
struct foo {
  int bar;  /*!< This is a member.
                 It also has a meaning. */
};

Преобразуется в:

/// @brief My foo struct.
struct foo {
  int bar;  ///< This is a member.
            ///< It also has a meaning.
};
0 голосов
/ 02 апреля 2014

из соглашения команды PHP ... должно быть какое-то рассуждение, если вопрос был задан. Просто ответь, если знаешь.

Никогда не используйте комментарии в стиле C ++ (т.е. // комментарий). Всегда используйте стиль C комментарии вместо. PHP написан на C и предназначен для компиляции под любым ANSI-C-совместимым компилятором. Хотя многие компиляторы принимать комментарии в стиле C ++ в коде C, вы должны убедиться, что ваши код будет компилироваться и с другими компиляторами. Единственным исключением из этого правила является код, специфичный для Win32, потому что порт Win32 специфичен для MS-Visual C ++, и этот компилятор известно, что он принимает комментарии в стиле C ++ в коде C.

0 голосов
/ 12 марта 2014

Очень старый вопрос, я знаю, но я только что достиг этого, используя "чистый emacs". Короче говоря, решение выглядит следующим образом:

Выполнить M-x query-replace-regexp. При появлении запроса введите

/\*\(\(.\|^J\)*?\)*\*/

в качестве регулярного выражения для поиска. ^J - это новая строка, которую вы можете ввести, нажав ^Q (Ctrl + Q на большинстве клавиатур), а затем нажмите клавишу ввода. Затем введите

//\,(replace-regexp-in-string "[\n]\\([ ]*?\\)   \\([^ ]\\)" "\n\\1// \\2" \1))

в качестве выражения замены.

По сути, идея заключается в том, что вы используете два вложенных поиска регулярных выражений. Основной просто находит комментарии в стиле C (очень быстрое повторение *? очень удобно для этого). Затем выражение elisp используется для выполнения второй замены только внутри текста комментария . В этом случае я ищу новые строки с пробелом и замену последних трех пробелов на //, что хорошо для сохранения форматирования комментариев (работает только до тех пор, пока все комментарии имеют отступ).

Изменения во вторичном регулярном выражении приведут к тому, что этот подход будет работать в других случаях, например

//\,(replace-regexp-in-string "[\n]" " " \1))

просто поместит все содержимое исходного комментария в один комментарий в стиле C ++.

0 голосов
/ 12 февраля 2009

Есть несколько предложений, которые вы можете попробовать:

a) Напишите свой собственный код (C / Python / любой язык, который вам нравится), чтобы заменить комментарии. Что-то вроде того, что сказал регулярное выражение или это наивное решение '' может ' работать: [Исключая случаи, подобные тому, что написал один из них, опубликовал Даррон]

 
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

б) Найдите инструмент для этого. (Я найду некоторые и отправлю, если найду их.)

в) Почти все современные IDE (если вы их используете) или текстовые редакторы имеют функцию автоматического комментирования. Затем вы можете вручную открыть каждый файл, выбрать строки комментариев, решить, как справиться с ситуацией, и прокомментировать стиль C ++ с помощью ускорителя (скажем, Ctrl + M). Затем вы можете просто «найти и заменить» все «/ *» и «* /», снова используя свое суждение. Я настроил Gedit для этого с помощью плагина «Code Comment». Я не помню, как я делал это в Vim от руки. Я уверен, что этот можно легко найти.

0 голосов
/ 12 февраля 2009

Если есть только «несколько файлов», действительно ли необходимо писать программу? Открытие его в текстовом редакторе может сделать это быстрее на практике, если нет полной загрузки комментариев. В emacs есть команда comment-region, которая (что неудивительно) комментирует регион, так что это был бы просто случай отбросить оскорбительные '/ *' и '* /'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...