Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

}

void f(int);

int main

{

a = 7; // это глобальная переменная a (::a)

f(2); // это глобальная функция f (::f)

Foo::f(3); // это функция f из пространства имен Foo

::f(4); // это глобальная функция f (::f)

}

Имена можно явно уточнять именами их пространств имен (например,

Foo::f(3)
) или оператором разрешения области видимости
::
(например,
::f(2)
), который относится к глобальному пространству имен.

Все имена в пространстве имен (например, в стандартном пространстве

std
) можно сделать доступными с помощью директивы
using namespace std
;

Будьте осторожны с директивой

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

using Foo::g;

g(2); // это функция g из пространства имен Foo (Foo::g)

Более подробная информация о пространствах имен содержится в разделе 8.7.

A.16. Альтернативные имена

Для имени можно определить альтернативное имя (alias); иначе говоря, можно определить символическое имя, которое будет означать то же самое, что и имя, с которым оно связано (для большинства случаев употребления этого имени).

typedef int* Pint; // Pint — это указатель на int

namespace Long_library_name { /* ... */ }

namespace Lib = Long_library_name; // Lib — это Long_library_name

int x = 7;

int& r = x; // r — это x

Ссылки (см. разделы 8.5.5 и A.8.3) — это механизм указания на объекты, работающий на этапе выполнения программы. Ключевые слова

typedef
(см. разделы 20.5 и 27.3.1) и
namespace
относятся к механизмам ссылок на имена, работающим на этапе компиляции. В частности, инструкция
typedef
не вводит новый тип, а просто задает новое имя существующего типа. Рассмотрим пример.

typedef char* Pchar; // Pchar — это имя типа char*

Pchar p = "Idefix"; // OK: p — это указатель типа char*

char* q = p; // OK: p и q — указатели типа char

int x = strlen(p); // OK: p — указатель типа char*

A.17. Директивы препроцессора

Каждая реализация языка C++ содержит препроцессор (preprocessor). В принципе препроцессор работает до компилятора и преобразовывает исходный код, написанный нами, в то, что видит компилятор. В действительности это действие интегрировано в компиляторе и не представляет интереса, за исключением того, что оно может вызывать проблемы. Каждая строка, начинающаяся символом

#
, представляет собой директиву препроцессора.

A.17.1. Директива #include

Мы широко использовали препроцессор для включения заголовочных файлов. Рассмотрим пример.

#include "file.h"

Эта директива приказывает препроцессору включить содержимое файла

file.h
в точку исходного текста, где стоит сама директива. Для стандартных заголовков используются угловые скобки
(<...>
), а не кавычки (
"..."
). Например:

#include<vector>

Это рекомендованная система обозначений для включения стандартных заголовков.

A.17.2. Директива #define

Препроцессор выполняет также определенные манипуляции с символами, которые называются макроподстановками (macro substitution). Например, определим имя символьной строки.

#define FOO bar

Теперь везде, где препроцессор увидит символы

FOO
, они будут заменены символами
bar
.

int FOO = 7;

int FOOL = 9;

В таком случае компилятор увидит следующий текст:

int bar = 7;

int FOOL = 9;

Обратите внимание на то, что препроцессор знает об именах языка С++ достаточно много, чтобы не заменить символы

FOO
, являющиеся частью слова
FOOL
.

  • Читать дальше
  • 1
  • ...
  • 485
  • 486
  • 487
  • 488
  • 489
  • 490
  • 491
  • 492
  • 493
  • 494
  • 495
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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