Программисты, привыкшие работать в интегрированной среде разработки, оценят имеющиеся в Emacs средства автоматического форматирования кода. При открытии исходного файла, написанного на C/C++, редактор самостоятельно определяет наличие в нем программного кода, а не просто текста. Если нажать клавишу
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
Предположим, имеется проект, в который входят два исходных файла: один написан на С (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++
попытается скомпоновать программу и создать исполняемый файл.