C++. Сборник рецептов - страница 10
Примеры 1.1, 1.2 и 1.3 представляют исходный код приложения hellobeatles, которое выводит текст
>John, Paul, George, and Ringo
на консоль. Это приложение можно написать в виде единого исходного файла, но я разбил его на три модуля: статическую библиотеку libjohnpaul, динамическую библиотеку libgeorgeringo и исполняемый файл hellobeatles. Более того, хотя каждая из этих библиотек могла бы быть легко реализована как один заголовочный файл и один файл .cpp, я, чтобы проиллюстрировать компиляцию и компоновку проектов, содержащих более одного исходного файла, разбил реализацию на несколько исходных файлов.
Исходный код libjohnpaul представлен в примере 1.1. Открытый интерфейс libjohnpaul состоит из одной функции >johnpaul()
, объявленной в заголовочном файле johnpaul.hpp. Функция >johnpaul()
отвечает за печать:
>John, Paul,
на консоль. Реализация >johnpaul()
разбита на два. исходных файла — john.cpp и paul.cpp, каждый из которых отвечает за печать одного имени.
Пример 1.1. Исходный код libjohnpaul
johnpaul/john.hpp
>#ifndef JOHN_HPP_INCLUDED
>#define JOHN_HPP_INCLUDED
>void john(); // Печатает "John, "
>#endif // JOHN _HPP_INCLUDED
johnpaul/john.cpp
>#include
>#include "john.hpp"
>void john() {
> std::cout << "John, ";
>}
johnpaul/paul.hpp
>#ifndef PAUL_HPP_INCLUDED
>#define PAUL_HPP_INCLUDED
>void paul(); // Печатает " Paul, "
>#endif // PAUL_HPP_INCLUDED
johnpaul/paul.cpp
>#include
>#include "paul.hpp"
>void paul() {
> std::cout << "Paul, ";
>}
johnpaul/johnpaul.hpp
>#ifndef JOHNPAUL_HPP_INCLUDED
>#define JOHNPAUL_HPP_INCLUDED
>void johnpaul(); // Печатает "John, Paul, "
>#endif // JOHNPAUL_HPP_INCLUDED
johnpaul/johnpaul.cpp
>#include "john.hpp"
>#include "paul.hpp"
>#include "johnpaul.hpp"
>void johnpaul() {
> john();
> paul();
>}
Исходный код libgeorgeringo представлен в примере 1.2. Открытый интерфейс libgeorgeringo состоит из одной функции >georgeringo()
, объявленной в заголовочном файле georgeringo.hpp. Как вы могли догадаться, функция >georgeringo()
отвечает за печать:
>George, and Ringo
на консоль. И снова реализация >georgeringo()
разделена на два исходных файла — george.cpp и ringo.cpp.
Пример 1.2. Исходный код libgeorgeringo
georgeringo/george.hpp
>#ifndef GEORGE_HPP_INCLUDED
>#define GEORGE_HPP_INCLUDED
>void george(); // Печатает "George, "
>#endif // GEORGE_HPP_INCLUDED
georgeringo/george.cpp
>#include
>#include "george.hpp"
>void george()
> std::cout << "George, ";
>}
georgeringo/ringo.hpp
>#ifndef RINGO_HPP_INCLUDED
>#define RINGO_HPP_INCLUDED
>void ringo(); // Печатает "and Ringo\n"
>#endif // RINGO_HPP_INCLUDED
georgeringo/ringo.cpp
>#include
>#include "ringo.hpp"
>void ringo() {
> std::cout << "and Ringo\n";
>}
georgeringo/georgeringo.hpp
>#ifndef GEORGERINGO_HPP_INCLUDED
>#define GEORGERINGO_HPP_INCLUDED
>// определите GEORGERINGO_DLL при сборке libgeorgeringo.dll
>#if defined(_WIN32) && !defined(__GNUC__)
>#ifdef GEORGERINGO_DLL
># define GEORGERINGO_DECL __declspec(dllexport)
>#else
># define GEORGERINGO_DECL __declspec(dllimport)
>#endif
>#endif // WIN32
>#ifndef GEORGERINGO_DECL
># define GEORGERINGO_DECL
>#endif
>// Печатает "George, and Ringo\n"
>#ifdef __MWERKS__
># pragma export on
>#endif
>GEORGERINGO_DECL void georgeringo();
>#ifdef __MWERKS__
># pragma export off
>#endif
>#endif // GEORGERINGO_HPP_INCLUDED
georgeringo/georgeringo.cpp
>#include "george.hpp"
>#include "ringo.hpp"
>#include "georgeringo.hpp"
>void georgeringo() {
> george();
> ringo();
>}
Заголовок georgeringo.hpp содержит несколько сложных директив препроцессора. Если вы их не понимаете, не страшно. Я объясню их в рецепте 1.4.