Программирование для Linux. Профессиональный подход - страница 5
>int main() {
>printf("Hello, world\n");
>}
Нажатие клавиши >printf()
приведет к следующему результату:
>int main() {
> printf("Hello, world\n");
>}
По мере работы с редактором Emacs читатели изучат и другие средства форматирования. Особенность редактора заключается в том. что он позволяет программировать практически любые операции, связанные с автоматическим форматированием. Благодаря этому были реализованы режимы редактирования множества видов документов, разработаны игры[3] и даже СУБД.
1.1.3. Синтаксические выделения
Помимо форматирования программного кода Emacs упрощает чтение файлов, написанных на C/C++, выделяя цветом различные синтаксические элементы. Например, ключевые слова могут быть выделены одним цветом, названия встроенных типов данных — другим, а комментарии — третьим. Подобный подход облегчает нахождение некоторых широко распространенных синтаксических ошибок.
Чтобы включить режим цветовых выделений, откройте файл >~/.emacs
и вставьте в него такую строку:
>(global-font-lock-mode t)
Сохраните файл, выйдите из Emacs и перезапустите редактор. Теперь можете открыть нужный исходный файл и наслаждаться!
Внимательные читатели, возможно, обратили внимание на то, что строка, вставленная в файл >.emacs
, выглядит написанной на языке LISP. Это и есть LISP! Большая часть редактора Emacs реализована именно на этом языке. На нем же можно писать расширения к редактору.
1.2. Компиляторы GCC
Компилятор превращает исходный текст программы, понятный человеку, в объектный код. исполняемый компьютером. Компиляторы, доступные в Linux-системах, являются честью коллекции GNU-компиляторов, известной как GCC (GNU Compiler Collection).[4] В нее входят компиляторы языков С, C++, Java, Objective-C, Fortran и Chill. В этой книге нас будут интересовать лишь первые два.
Предположим, имеется проект, в который входят два исходных файла: один написан на С (>main.c
; листинг 1.1), а другой — на C++ (>reciprocal.cpp
; листинг 1.2). После компиляции оба файла компонуются вместе, образуя программу >reciprocal
,[5] которая вычисляет обратное заданного целого числа.
>#include
>#include "reciprocal.hpp"
>int main(int argc, char **argv) {
> int i;
> i = atoi(argv[1]);
> printf("The reciprocal of %d is %g\n", i, reciprocal(i));
> return 0;
>}
>#include
>#include "reciprocal.hpp"
>double reciprocal (int i) {
> // Аргумент не должен быть равен нулю
> assert(i != 0);
> return 1.0/i;
>}
Есть также файл заголовков, который называется >reciprocal.hpp
(листинг 1.3).
>#ifdef __cplusplus
>extern "С" {
>#endif
>extern double reciprocal(int i);
>#ifdef __cplusplus
>}
>#endif
Первый шаг заключается в превращении исходных файлов в объектный код.
1.2.1. Компиляция одного исходного файла
Компилятор языка С называется >gcc
. При компиляции исходного файла нужно указывать опцию >-с
. Вот как, например, в режиме командной строки компилируется файл >main.с
:
>% gcc -с main.с
Полученный объектный файл будет называться >main.o
.
Компилятор языка C++ называется >g++
. Он работает почти так же, как и >gcc
. Следующая команда предназначена для компиляции файла >reciprocal.cpp
:
>% g++ -c reciprocal.cpp
Опция >-с
говорит компилятору о необходимости получить на выходе объектный файл (он будет называться >reciprocal.o
). Без неё компилятор >g++
попытается скомпоновать программу и создать исполняемый файл.
В процессе написания любой более-менее крупной программы обычно задействуется ряд дополнительных опций. К примеру, опция >-I
сообщает компилятору о том, где искать файлы заголовков. По умолчанию компиляторы GCC просматривают текущий каталог, а также каталоги, где установлены файлы стандартных библиотек. Предположим, наш проект состоит из двух каталогов: >src
и >include
. Следующая команда даст компилятору >g++
указание дополнительно искать файл >reciprocal.hpp
в каталоге >../include
:
>% g++ -с -I ../include reciprocal.cpp
Иногда требуется задать макроконстанты в командной строке. Например, в коммерческой версии программы нет необходимости осуществлять избыточную проверку утверждения в файле