2013-02-21 7 views
0

Ниже приведена опечатка для C++ include guard. Оба должны читать _MYFILE_H_.Найти включить защитные опечатки на C++ с помощью gnu coreutils

#ifndef _MYFILE_H_ 
#define _MYFLIE_H_ 

Как бы вы предлагаете искать кучу файлов заголовков для опечатка, как это с помощью Coreutils GNU (например, Grep, AWK)?

+0

Сохранить время и #define _MYFLIE_H_ _MYFILE_H_ – QuentinUK

+0

Я только узнал simpled поиск не будет задать расширенное делать: HTTP: // StackOverflow .com/q/3717772/ – kay

+2

Также не следует читать '_MYFILE_H_'. '' Имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква, и имена, содержащие два последовательных символа подчеркивания, зарезервированы для реализации. Не используйте их. –

ответ

2

Вы можете использовать awk:

{ 
    if ($1 == "#ifndef") { was_ifdef = 1; def = $2 } 
    else if ($1 == "#define" && was_ifdef) 
    { 
     if ($2 != def) printf("Mismatch in %s: expected %s found %s\n", FILENAME, def, $2); 
    } 
    else was_ifdef = 0; 
} 

Там может быть более умные способы сделать это, но это (для меня) вполне понятно и легко.

Примечание: Это покажет «ложных срабатываний», если файл содержит что-то вроде

#ifndef FOO_DEFINED 
typedef int foo; 
#define FOO_DEFINED 
#endif 
+0

Я действительно не хотел быть таким конкретным. Я тоже упоминал awk в вопросе, так что спасибо. –

+0

Хорошо, удалил мой комментарий и добавил заметку о «потенциальном ложном срабатывании». –

+0

Это создало несколько ложных срабатываний, как вы сказали (в основном с помощью макрофункций), но я смог найти еще одну опечатку с вашим скриптом. Благодаря! –

1

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

В частности, язык всех строк вида

#ifndef X 
#define Y 

Где XY не является регулярным языком. Вы можете доказать это, используя теорему Михилла-Нерода (поскольку любые две строки вида #ifndef X для разных вариантов X попадают в разные классы эквивалентности отношения различимости). В результате нет никакого способа написать регулярное выражение, которое может соответствовать строкам этой формы, а так как grep использует чистые математические регулярные выражения, нет способа использовать grep для решения этой проблемы.

Извините за отрицательный результат, но я надеюсь, что это поможет!

1

Несколько команд sed могли бы сделать трюк.

for FILENAME in ./*.h; do 
    [[ $(sed -n '1p' "$FILENAME" | sed -e 's/#ifndef //') != $(sed -n '2p' "$FILENAME" | sed -e 's/#define //') ]] && echo "$FILENAME" 
end 

Проблема с этой реализацией заключается в том, что над охранником не может быть заголовок защиты.

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