Программирование >>  Разработка устойчивых систем 

1 ... 46 47 48 [ 49 ] 50 51 52 ... 196


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++:



1 ... 46 47 48 [ 49 ] 50 51 52 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика