У меня есть программа под названием scc
, которая удаляет комментарии C (и комментарии C ++, хотя с C99 они одинаковы). Примените это плюс фильтр для удаления пустых строк и, если необходимо, строк, содержащих только открытые и закрытые скобки, для генерации количества строк. Я использовал это на внутренних проектах - не нужно было скидывать скобки открытия / закрытия. Эти сценарии были более сложными, сравнивая исходный код для двух разных версий существенного проекта, хранящегося в ClearCase. Они также вели статистику по добавленным и удаленным файлам, а также по добавленным и удаленным строкам из общих файлов и т. Д.
Не считая фигурных скобок, имеет значение:
Black JL: co -q -p scc.c | scc | sed '/^[ ]*$/d' | wc -l
208
Black JL: co -q -p scc.c | scc | sed '/^[ {}]*$/d' | wc -l
144
Black JL: co -p -q scc.c | wc -l
271
Black JL:
Итак, 144 строки под ваши правила; 208 считая открытых и закрытых фигурных скобок; 271, считая все.
Позвольте мне знать, если вы хотите код для scc
(отправьте письмо на первую точку в последнюю очередь на gmail точка com). Это 13 килобайт сжатого tar-файла, включая man-страницу, тест на пытки и некоторые библиотечные файлы.
@ litb отметил, что 'cpp -fpreprocessed -P file
' обрабатывает удаление
Комментарии. В основном это так. Тем не менее, когда я запускаю его на стресс-тест
для SCC он жалуется, когда (по моему мнению) он не должен:
SCC has been trained to handle 'q' single quotes in most of
the aberrant forms that can be used. '\0', '\', '\'', '\\
n' (a valid variant on '\n'), because the backslash followed
by newline is elided by the token scanning code in CPP before
any other processing occurs.
Когда CPP из GCC 4.3.2 обрабатывает это, он жалуется (предупреждает):
SCC has been trained to handle 'q' single quotes in most of
<stdin>:2:56: warning: missing terminating ' character
the aberrant forms that can be used. '\0', '\', '\'', '\\
<stdin>:3:27: warning: missing terminating ' character
n' (a valid variant on '\n'), because the backslash followed
by newline is elided by the token scanning code in CPP before
any other processing occurs.
Раздел 5.1.1.2 Фазы перевода стандарта C99 гласят:
Приоритет среди синтаксических правил перевода определяется следующими этапами. ( Сноска 5 )
Отображаются многобайтовые символы физического исходного файла в определенной реализацией
образом, к исходному набору символов (ввод символов новой строки для
индикаторы конца строки) при необходимости. Триграф последовательности заменяются
соответствующие односимвольные внутренние представления.
Каждый экземпляр символа обратной косой черты () сразу же сопровождается новой строкой
символ удаляется, объединяя физические исходные строки для формирования логических исходных строк.
Только последняя обратная косая черта в любой строке физического источника имеет право быть частью
такого сращивания. Исходный файл, который не является пустым, должен заканчиваться символом новой строки,
которому не должен предшествовать символ обратной косой черты перед любым таким
происходит сращивание.
Сноска 5:
(5) Реализации должны вести себя так, как будто эти отдельные фазы происходят, даже
хотя на практике многие обычно складываются вместе.
Следовательно, на мой взгляд, CPP неправильно обрабатывает второй этап в тексте примера. Или, по крайней мере, предупреждение не то, что я хочу - конструкция является допустимой C, и это не самоочевидно, что предупреждение оправдано.
Конечно, это крайний случай, и допускаются дополнительные предупреждения. Но это раздражало бы живые дневные огни из меня. Если бы у меня не было своего собственного, возможно, лучшего инструмента для работы, тогда подойдет 'cpp -fpreprocessed -P
' - это крайний крайний случай, на который я жалуюсь (и, возможно, было бы правомерно утверждать, что это более вероятно, что есть проблема, чем нет - хотя лучшая эвристика заметила бы, что линия была сращена, и результатом была допустимая константа из одного символа, и поэтому жалоба должна быть подавлена; если результат не был допустимой константой из одного символа, тогда должна быть подана жалоба. (В моем тестовом случае - по общему признанию, тест на пытки - CPP дает 13 проблем, в основном связанных с той, на которую я жалуюсь, где SCC правильно выдает 2.)
(Я заметил, что '-P
' удается подавить директиву #line
в выводе, который появляется, когда опция не указана.)