Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

Ниже показан файл main.cpp:

01 #include <cstdlib>

02 #include <iostream>

03 using namespace std;

04 double square(double);

05 int main(int argc, char *argv[])

06 {

07 if (argc != 2) {

08 cerr << "Usage: square <number>" << endl;

09 return 1;

10 }

11 double n = strtod(argv[1], 0);

12 cout << "The square of " << argv[1] << " is " << square(n) << endl;

13 return 0;

14 }

Исходный

файл main.cpp содержит определение функции main. В С++ эта функция принимает в качестве параметров int и char * (массив символьных строк). Имя программы находится в argv[0], а аргументы командной строки — в argv[1], argv[2], … argv[argc — 1]. Параметры имеют стандартные имена argc («argument count» — количество аргументов) и argv («argument values» — значения аргументов). Если программа не использует аргументы командной строки, функцию main можно определить без параметров.

Функция main использует из стандартной библиотеки С++ функции strtod («string to double» — преобразование строки в переменную двойной точности), cout (стандартный поток вывода С++) и cerr (стандартный поток вывода сообщений об ошибках С++) для преобразования аргумента командной строки в тип double и для вывода текста на консоль. Строки, числа и маркеры конца строки (endl) выводятся с помощью оператора <<, который также используется для сдвига битов. Чтобы воспользоваться этой стандартной функциональностью, необходимо включить директивы #include, расположенные в строках 1 и 2.

Директива using namespace в строке 3 указывает компилятору на то, что мы хотим импортировать в глобальное пространство имен все идентификаторы, объявленные в пространстве имен std. Это позволяет нам пользоваться записью strtod, cout, cerr и endl вместо указания полных имен: std::strtod, std::cout, std::cerr и std::endl. В С++ оператор :: разделяет компоненты сложного имени.

В строке 4 объявляется прототип функции. Он указывает компилятору на то, что существует функция с данными параметрами и возвращаемым значением. Реальное определение функции может находиться в той же или в другой единице компиляции. Без прототипа функции компилятор не позволил бы нам вызвать эту функцию в строке 12. Имена параметров функции указывать необязательно.

Процедура компиляции программы зависит от платформы. Например, для компиляции программы в Solaris с использованием компилятора С++ компании «Sun» мы могли бы задать следующие команды:

CC -с main.cpp

CC -с square.cpp

ld main.o square.o -о square

Первые две строки вызывают компилятор, чтобы сгенерировать файлы для соответствующих файлов .cpp. Третья

строка вызывает компоновщик и формирует исполняемый модуль с именем square, который может запускаться следующим образом:

./square 64

Эта программа выводит на консоль следующее сообщение:

The square of 64 is 4096

(Квадрат числа 64 равен 4096)

Чтобы скомпилировать программу, вы, возможно, попросите помощи у местного опытного программиста С++. Если это не удастся сделать, можете прочитать остальную часть приложения, ничего не компилируя, и воспользоваться инструкциями в главе 1 по компиляции вашего первого приложения C++/Qt. В Qt предусмотрены утилиты, позволяющие легко создавать приложения на любой платформе.

Вернемся к нашей программе. В реальном приложении, как правило, мы размещали бы прототип функции square в отдельном файле и включали бы этот файл во все единицы компиляции, в которых вызывается эта функция. Такой файл называется заголовочным; он обычно имеет расширение .h (часто встречаются также расширения .hh, .hpp и .hxx). Если переделать наш пример, используя заголовочный файл, то можно было бы создать файл с именем square.h, который содержит следующие строки:

1 #ifndef SQUARE_H

2 #define SQUARE_H

3 double square(double);

4 #endif

В начале и в конце заголовочного файла задаются препроцессорные директивы (#ifndef, #define и #endif). Эти директивы гарантируют однократное выполнение заголовочного файла, даже если он несколько раз включается в одну и ту же единицу компиляции (такая ситуация возникает, когда одни заголовочные файлы включают в себя другие заголовочные файлы). По принятым соглашениям используемый для этого препроцессорный символ строится на основе имени файла (в нашем примере это символ SQUARE_H). Позже в этом приложении мы вернемся к рассмотрению препроцессора.

Новый файл main.cpp будет иметь следующий вид:

01 #include <cstdlib>

02 #include <iostream>

03 #include "square.h"

04 using namespace std;

05 int main(int argc, char *argv[])

06 {

07 if (argc != 2) {

08 cerr << "Usage: square <number>" << endl;

09 return 1;

10 }

11 double n = strtod(argv[1], 0);

12 cout << "The square of " << argv[1] << " is " << square(n) << endl;

13 return 0;

14 }

Используемая в строке 3 директива #include разворачивает содержимое файла square.h. Директивы, начинающиеся с символа #, рассматриваются препроцессором С++ до фактической компиляции. В прежние дни препроцессор являлся отдельной программой, которую программист вызывал вручную перед выполнением компилятора. В современных компиляторах этап препроцессорной обработки выполняется автоматически.

Поделиться:
Популярные книги

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Эра Мангуста. Том 2

Третьяков Андрей
2. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эра Мангуста. Том 2

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Помещицы из будущего

Порохня Анна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Помещицы из будущего

Шлейф сандала

Лерн Анна
Фантастика:
фэнтези
6.00
рейтинг книги
Шлейф сандала

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Император

Рави Ивар
7. Прометей
Фантастика:
фэнтези
7.11
рейтинг книги
Император

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри