Почему const подразумевает внутреннюю связь в C ++, а в C нет? - PullRequest
73 голосов
/ 16 июня 2009

см. Тему. О чем они думали?

ОБНОВЛЕНИЕ: изменено со "статического" на "внутреннее соединение", чтобы избежать путаницы.

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

const int var_a = 1;
int var_b = 1;

... и компиляция с g++ -c test.cpp только экспортирует var_b.

Ответы [ 7 ]

101 голосов
/ 16 июня 2009

Я полагаю, вы имеете в виду

Почему const подразумевает внутреннюю связь в C ++

Это правда, что если вы объявляете объект const в области имен, он имеет внутреннюю связь.

Приложение C ( C ++ 11, C.1.2 ) дает обоснование

Изменение: Имя области файла, которая явно объявлена ​​как const, а не явно объявлена ​​как extern, имеет внутреннюю связь, тогда как в C она будет иметь внешнюю связь

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

11 голосов
/ 16 июня 2009

Как сказал Литб, константные объекты имеют внутреннюю связь. Это потому, что они предназначены для использования следующим образом:

// a.cpp
const int BUFSIZE = 100;
char abuf[BUFSIZE];

// b.cpp
const int BUFSIZE = 256
int bbuf[BUFSIZE];
6 голосов
/ 16 июня 2009

В C & C ++ термин static имеет несколько значений (он может управлять связью и хранением) Вам нужно прочитать D & E Страуструпа, чтобы оценить его обоснование - но когда вы объявляете переменную константой в области имен, она автоматически имеет внутреннюю связь - тогда как в C вы должны объявить ее статической, чтобы она имела внутреннюю связь.

Конечно, в C ++ использование static для управления связями не рекомендуется, анонимные пространства имен могут использоваться для имитации внутренних связей в C ++.

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

5 голосов
/ 16 июня 2009

Const и static являются ортогональными понятиями в C и C ++.

Ключевое слово const указывает компилятору запретить отображать переменную как lvalue любого выражения - по сути, делая ее доступной только для чтения.

В C ключевое слово static имеет несколько применений в зависимости от того, к чему оно применяется. Применительно к переменной функции это указывает на то, что переменная не хранится в локальной области действия функции, но доступна через все ее вызовы. При применении к глобальной переменной или функции она становится доступной только для определенного файла - другими словами, она доступна только внутри модуля компиляции (если не объявлено extern).

В C ++ ключевое слово static можно использовать в определении класса, чтобы создать переменную или функции shared для всех экземпляров класса, а не быть локальными для каждого экземпляра. Кроме того, функция статического класса в C ++ может обращаться только к статическим переменным этого класса (или к классам, к которым она имеет доступ). Теперь в C ++ const дает внутреннюю связь членов с модулем компиляции, если они явно не объявлены extern - это может быть то, что вы на него ссылаетесь. Это позволяет совместно использовать константы времени компиляции через модуль с помощью заголовочных файлов. Имейте в виду, однако, что члены на самом деле не являются статическими - скорее, константа компилируется в в каждом месте, где на нее ссылаются.

3 голосов
/ 16 июня 2009

Эти понятия ортогональны и не должны рассматриваться как одно и то же.

Constness является правом доступа: он сообщает только, должна ли ваша переменная быть только для чтения (const) или для записи-чтения (не-const).

Статичность - это свойство времени жизни (и технически локализации памяти): оно сообщает, будет ли переменная глобальной в области видимости класса (когда он находится в классе) или единицей перевода (когда используется с глобальной переменной, определенной в a cpp).

0 голосов
/ 16 июня 2009

Это не так, и наиболее очевидный пример состоит в том, что если у вас есть переменная-член const (которая, конечно, инициализируется конструктором), она не используется всеми объектами этого класса, но индивидуальна для каждого.

class A {
public:
  A(int newx) : x(newx);
private
  int x;
}

Литб дает лучший ответ, выше.

0 голосов
/ 16 июня 2009

Это не так. Пишем следующее:

const int i = 0;

не делает i статичным (в C или C ++).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...