Модификатор 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
{
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. Следующий код иллюстрирует эти утверждения: