|
Программирование >> Разработка устойчивых систем
int main(int argc. char* argv[]) { if(argc > 1) cppCheck(argv[l]): else cppCheck( cppCheckTest. h ); } III:- Для начала обратите внимание на вспомогательную функцию startsWith(), которая возвращает true, если первый строковый аргумент начинается со второго аргумента. Она используется при проверке стандартных комментариев и директив условного включения. Наличие массива строк part позволяет легко организовать перебор последовательности ожидае.мых строк в исходном коде. Если исходный файл не существует, команды просто записываются в новый файл с заданным именем. Если файл существует, программа последовательно проверяет начальные строки и убеждается в присутствии обязательных строк. Если эти строки отсутствуют, они вставляются в файл. При этом необходимо особо позаботиться о том, чтобы не удалить существующие строки (см. использование логической переменной lineUsed). Обратите внимание: для существующего файлазадействуется объект stringstream, и это позволяет нам сначала записать в него содержимое файла, а затем прочитать его и провести поиск. В перечисляемый тип включены индексы компонентов, представленные следующими именами: BASE - имя базового фаР1ла (без расширения), записанное в верхнем регистре; HEADER - имя заголовочного файла; IMPLEMENT - имя файла реализации (срр); HLINEl - заготовка первой строки заголовочного файла; GUARDl, GUARD2 и GUARDS - сторожевые строки заголовочного файла, предотвращающие повторное включение; CPPLINEl - заготовка первой строки файла реализации (срр); INCLUDE - строка файла реализации, в которой включается заголовочный файл. lineUsed = false; Копирование остатка файла if (llineUsed) newcpp s endl; newcpp cppfile.rdbufO: При наличии изменений файл перезаписывается: if(changed){ existcpp.closeO; ofstream newCPP(part[IMPLEMENT].c str()); assure(newCPP, part[IMPLEMENT].c str()): newCPP ? \n Признак модификации newcpp.str(): При запуске без аргументов программа создает следующие два файла: CPPCHECKTEST.h #1fndef CPPCHECKTEST H #define CPPCHECKTEST H #end1f CPPCHECKTESTJ CPPCHECKTEST.cpp #1nclude CPPCHECKTEST.h Мы удалили двоеточие после в первом комментарии, чтобы не смущать программу извлечения кода. Двоеточие будет присутствовать в коде, фактически сгенерированном программой cppCheck. Попробуйте поэкспериментировать с этими файлами, удаляя из них отдельные строки и запуская программу заново. При каждом запуске обязательные строки будут снова появляться в файле. При модификации в файл вставляется первая строка @ , единственное назначение которой - привлечь внимание читателя. Перед повторной обработкой файла эту строку необходимо удалить (в противном случае cppcheck сочтет, что в файле отсутствует первая строка с комментарием). Обнаружение ошибок компиляции Весь программный код, приводимый в книге, должен компилироваться без ошибок. Строки, намеренно порождающие ошибки компиляции, помечаются специальным комментарием !. Следующая программа удаляет эти специальные комментарии, а в конец строки добавляется нумерованный комментарий. При запуске компилятора генерируются сообщения об ошибках, в которых будут присутствовать эти номера. Программа также включает модифицированную строку в специальный файл, что упрощает поиск строк, которые были откомпилированы без ошибок. : C04:Showerr.cpp Удаление комментариев из строк с ошибками компиляции #inc1ude <cstddef> #1nclude <cstdl1b> #1nclude <cstdio> #include <fstream> #1nclude <iostream> #include <sstream> #include <str1ng> #include ../require.h using namespace std: const string usage = usage: showerr filename chapnum\n where filename is a С++ source file\n and chapnum is the chapter name its in.\n Finds lines commented with ! and removes\n comment, appending (#) where # is unique\n across all files, so you can determineVn if your compiler finds the error.\n showerr /r\n resets the unique counter. : class Showerr { const int CHAP: void saveFilesO { ofstream outfile(FNAME.c str()): Перезапись assure(outfile. FNAME.c str()): outfile edited.rdbufО: ofstream count(ERRNUM.c str()): Перезапись assure(count. ERRNUM.c str()): count counter: Сохранение нового счетчика int main(int argc. char* argv[]) { const string ERRCOUNK . ./errnum.txt ), ERRFILE( ../errlines.txt ): requireMinArgs(argc. 1, usage.c str()): if(argv[l][0] == 7 argv[l][0] == -) { Другие ключи: switch(argv[l][l]) { case r : case R : const string MARKER. FNAME: Файл со счетчиком номеров ошибок: const string ERRNUM: Файл с ошибочными строками: const string ERRFILE: stringstream edited: Измененный файл int counter: public: Showerr(const strings f. const strings en. const strings ef. int c) : CHAP(c). MARKERCV/! ). FNAME(f). ERRNUM(en). ERRFILE(ef). counter(O) {} void replaceErrorsO { ifstream infile(FNAME.c str()): assureCinfile, FNAME.c str()): ifstream count(ERRNUM.c str()): if(count) count counter: int linecount = 1: string buf: ofstream errlines(ERRFILE.c str(). ios::app): assure(errlines. ERRFILE.c str()): while(getline(infile. buf)) { Поиск маркера в начале строки: size t pos = buf.find(MARKER): if(pos != string::npos) { Удаление маркера: buf.erase(pos. MARKER.sizeO + 1): Присоединение счетчика и информации об ошибке: ostringstream out: out buf ( ++counter ) Chapter CHAP File: FNAME Line linecount endl: edited out.strO: errlines out.strO: Запись в файл ошибок else edited buf \n : Простое копирование linecount++:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |