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

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

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Некоторые ключевые слова в языке C++ являются макросами в языке C.

В языке C они определены в заголовочных файлах

<iso646.h>
и
<stdbool.h>
(
bool
,
true
,
false
). Не пользуйтесь тем, что они являются макросами в языке C.

27.3.3. Определения

Язык C++ допускает

определения в большем количестве мест программы по сравнению с языком C. Рассмотрим пример.

for (int i = 0; i<max; ++i) x[i] = y[i]; // определение переменной i,

// недопустимое в языке C

while (struct S* p = next(q)) { // определение указателя p,

// недопустимое в языке C

/* ... */

}

void f(int i)

{

if (i< 0 || max<=i) error("Ошибка диапазона");

int a[max]; // ошибка: объявление после инструкции

// в языке С не разрешено

/* ... */

}

Язык C (C89) не допускает объявлений в разделе инициализации счетчика цикла

for
, в условиях и после инструкций в блоке. Мы должны переписать предыдущий фрагмент как-то так:

int i;

for (i = 0; i<max; ++i) x[i] = y[i];

struct S* p;

while (p = next(q)) {

/* ... */

}

void f(int i)

{

if (i< 0 || max<=i) error("Ошибка диапазона");

{

int a[max];

/* ... */

}

}

В языке С++ неинициализированное объявление считается определением; в языке С оно считается простым объявлением, поэтому его можно дублировать.

int x;

int x; /* определяет или объявляет одну целочисленную переменную

с именем x в программе на языке C; ошибка в языке C++ */

В языке С++ сущность должна быть определена только один раз. Ситуация становится интереснее, если эти две переменные типа
int
с одинаковыми именами находятся в разных модулях компиляции.

/* в файле x.c: */

int x;

/* в файле y.c: */

int x;

Ни компилятор языка С, ни компилятор языка С++ не найдет никаких ошибок в файлах

x.c
или
y.c
. Но если файлы
x.c
и
y.c
скомпилировать как файлы на языке С++, то редактор связей выдаст сообщение об ошибке, связанной с двойным определением. Если же файлы
x.c
и
y.c
скомпилировать на языке C, то редактор связей не выдаст сообщений об ошибке и (в полном соответствии с правилами языка C) будет считать, что речь идет об одной и той же переменной
x
, совместно используемой в файлах
x.c
и
y.c
. Если хотите, чтобы в программе всеми модулями совместно использовалась одна глобальная переменная
x
, то сделайте это явно, как показано ниже.

/* в файле x.c: */

int x = 0; /* определение */

/* в файле y.c: */

extern int x; /* объявление, но не определение */

Впрочем, лучше используйте заголовочный файл.

/* в файле x.h: */

extern int x; /* объявление, но не определение */

/* в файле x.c: */

#include "x.h"

int x = 0; /* определение */

/* в файле y.c: */

#include "x.h"

/* объявление переменной x находится в заголовочном файле */

А еще лучше: избегайте глобальных переменных.

27.3.4. Приведение типов в стиле языка С

В языке C (и в языке C++) можете явно привести переменную

v
к типу
T
, используя минимальные обозначения.

(T)v

Это так называемое “приведение в стиле языка С”, или “приведение в старом стиле”. Его любят люди, не умеющие набирать тексты (за лаконичность) и ленивые (потому что они не обязаны знать, что нужно для того, чтобы из переменной
v
получилась переменная типа
T
). С другой стороны, этот стиль яростно отвергают программисты, занимающиеся сопровождением программ, поскольку такие преобразования остаются практически незаметными и никак не привлекают к себе внимания. Приведения в языке С++ (приведения в новом стиле (new-style casts), или приведения в шаблонном стиле (template-style casts); см. раздел А.5.7) осуществляют явное преобразование типов, которое легко заметить. В языке С у вас нет выбора.

int* p = (int*)7; /* интерпретирует битовую комбинацию:

reinterpret_cast<int*>(7) */

int x = (int)7.5; /* усекает переменную типа: static_cast<int>(7.5) */

typedef struct S1 { /* ... */ } S1;

typedef struct S2 { /* ... */ } S2;

S1 a;

const S2 b; /* в языке С допускаются неинициализированные

/* константы */

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

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5