Структура кода на С/С++
- Расширения файлов С++. Структура программы.
- Объявление. Определение
- Разбиение программы на файлы
- Заголовочные файлы
- Заголовочные файлы (продолжение)
- Заголовочные файлы (продолжение)
- Двойное включение
- Стражи включения
Расширения файлов С++. Структура программы
В С/C++ используются следующие расширения:
- .с, .cxx, .cc - для файлов с исходным кодом
- .hxx, .hh - для заголовочных файлов
Интересно отметить, что файлы стандартной библиотеки C++ не используют расширение вовсе, например: iostream, algorithm, vector.
Разделение на файлы с исходным кодом и заголовочные файлы чисто условное, нет правил, запрещающих использовать .cpp файл как заголовочный, однако мы не рекомендуем так делать - использование общепринятых правил именования файлов упростит жизнь вам и вашим коллегам.
Не стоит помещать определения в заголовочные файлы без явной необходимости. В С/C++ есть способы, позволяющие поместить определение в заголовочный файл, не вызвав ошибки компоновщика, но, как правило, это приводит к увеличению объектного файла и программы в целом.
Рассмотрим типичную структуру файла с программой на языке Си и правила его оформления на следующем простом примере:
/* Включить описания функций стандартного ввода-вывода */
#include <stdio.h>
/* Включить описания математических функций */
#include <math.h>
/* Другие включаемые файлы */
.
/* Собственно текст программы */
void main( void ) /* <-- заголовок главной функции */
{
float num; /* <-- описание типов данных */
/* Исполняемые операторы -* */
num = 2.345; /* Присвоим переменной num значение 2.345 */
printf( " sin(%f) = %f\n", num, sin(num) ); /* Вывод на экран */
}
Любой файл начинается с директив #include, вставляющих в текст программы так называемые заголовочные файлы, которые содержат описания функций, используемых в этом файле. В нашем примере это описания стандартных функций ввода-вывода <stdio.h> и математических функций <math.h>.
Далее следует заголовок главной функции программы main, операторы описания типов данных и исполняемые операторы.
Директивы #include должны всегда начинаться с новой строки, остальные же операторы программы могут иметь произвольное положение в файле вплоть до записи в одну строку. При записи не допускается разрывать слова, числа, двухсимвольные операции.
Пробелы используются для отделения слов друг от друга и для придания тексту большей выразительности и могут использоваться везде, за исключением случаев, описанных в предыдущем абзаце. Там, где допускается один пробел, можно поставить любое их количество.
В любом месте программы, там, где может стоять пробел, допускается записывать комментарии.
/* Это комментарий */
// Это тоже комментарии.
Комментарии должны помогать понять смысл выполняемых программой действий и являются обязательной ее частью. При написании комментариев следует придерживаться ряда простых истин:
-программы читаются людьми, компьютеру комментарии не нужны;
-всегда необходимы вводные комментарии, в которых указывается назначение программы, ее автор, дата написания и изменения, краткое описание алгоритма, входных и выходных данных, основных переменных и вызываемых функций;
-комментарии должны содержать дополнительную информацию, а не перефразировать программу;
-комментарии должны быть расположены так, чтобы программа не была менее наглядной;
-неправильные комментарии хуже, чем их отсутствие.
Стиль программирования, расположение операторов в строках, использование пробелов, выбор имен переменных и т. д. должны быть направлены на то, чтобы сделать программу более понятной людям, ее читающим.
Объявление. Определение
Объявление (declaration) — вводит имя, возможно, не определяя деталей. Например, ниже перечислены объявления:
int a; - объявление переменной типа int
void foo(); - объявление функции с именем foo
void bar() { foo(); } - объявление функции с именем bar
Определение (definition) - это объявление, дополнительно определяющее детали, необходимые компилятору. Из перечисленных выше объявлений, определениями являются только два:
int a; - объявление переменной типа int
void bar() { foo(); } - объявление функции вместе с телом является определением
Для определения переменной достаточно указать ее тип, а для определения функций, кроме имени, типов параметров и возвращаемого значения, нужно указать еще тело функции. Проще говоря, определение содержит всю информацию, необходимую компилятору, чтобы выделить память для хранения объекта.
В C++ есть также возможность объявить переменную, не определяя ее:
extern int a;
Ключевое слово extern как раз и позволяет сказать компилятору, что переменную нужно только объявить, при этом не нужно выделять под нее память - память под нее должна быть выделена в другом месте (возможно даже в другом файле).
Программы C++ допускают существование нескольких объявлений одного объекта (переменной, функции и др.), но не допускают наличия нескольких определений. Как правило, нарушение этого принципа приводит к ошибкам компоновщика, но может приводить и к ошибкам компиляции (повторное определение типов).
|