×
Traktatov.net » Язык программирования C [Лекции и упражнения, 6-е изд.] » Читать онлайн
Страница 554 из 557 Настройки

Модификатор const

В С глобальные идентификаторы const имеют внешнее связывание, но в C++ — внугреннее связывание. Другими словами, объявление в C++

const double PI = 3.14159; эквивалентно следующему объявлению в С:

static const double PI = 3.14159;

при условии, что оба они находятся вне функций. Правила C++ нацелены на то, чтобы упростить применение const в файлах заголовков. Если константа имеет внугреннее связывание, то каждый файл, включающий заголовок, получает собственную копию константы. Если же константа имеет внешнее связывание, то в одном файле должно присутствовать определяющее объявление, а во всех остальных файлах должно использоваться ссылочное объявление с ключевым словом extern.

Кстати, в C++ ключевое слово extern может применяться для обеспечения внешнего связывания значения const, поэтому оба языка позволяют создавать константы с внешним и внутренним связыванием. Разница состоит лишь в том, какой вид связывания используется по умолчанию.

Одно дополнительное свойство ключевого слова const в C++ заключается в том, что оно может применяться для объявления размера обычного массива:

const int ARSIZE = 100;

double loons[ARSIZE];   /* в C++ это тоже, что и double loons[100]; */

Такое же объявление можно делать и в С99, но это приведет к созданию массива переменной длины.

В языке C++, но не в С, значения const можно использовать для инициализации других значений const:

const double RATE = 0.06;       // допустимо в C++, С

const double STEP =24.5;       // допустимо в C++, С

const double LEVEL = RATE * STEP; // допустимо в C++, недопустимо в С


914 Приложение Б

Структуры и объединения

После объявления структуры или объединения с дескриптором в C++ этот дескриптор можно применять в качестве имени типа:

struct duo

{

int а; int b;

};

struct duo m; /* допустимо в С, C++          */

duo n;       /* недопустимо в С, допустимо в C++ */

В результате имя структуры может конфликтовать с именем переменной. Например, следующая программа компилируется как программа на С, но не может быть успешно скомпилирована как программа на C++, поскольку C++ интерпретирует duo в операторе printf() как тип структуры, а не как внешнюю переменную:

#include float duo = 100.3; int main(void)

{

struct duo { int a; int b,(); struct duo у = { 2, 4};

printf ("%f\n", duo); /* допустимо в С, но не в C++ */ return 0;

}

В С и C++ можно объявлять одну структуру внутри другой:

struct box

{

struct point {int x; int y; } upperleft; struct point lowerright;

};

В языке С любую из структур можно использовать позже, но C++ требует специальной формы записи для вложенной структуры:

struct box ad;         /*  допустимо в С,             C++      */

struct point dot;      /*  допустимо в С,         недопустимо  в      C++    */

box::point dot;        /* недопустимо в С, допустимо в C++*/

Перечисления

Язык C++ строже С в отношении применения перечислений. В частности, практически единственное, что можно делать с переменной enum — это присваивать ей константу enum и сравнивать ее с другими значениями. Нельзя присваивать значения int nеременной enum без явного приведения типа, равно как не допускается инкрементировать переменную enum. Следующий код иллюстрирует эти утверждения: