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

См. тему. О чем они думали?

UPDATE: изменено с "статического" на "внутреннее соединение", чтобы сохранить путаницу.

Чтобы привести пример... Вставьте следующее в файл:

const int var_a = 1;
int var_b = 1;

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

// b.cpp
const int BUFSIZE = 256
int bbuf[BUFSIZE];

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

litb дает лучший ответ выше.

Ответ 7

Это не так. Написав следующее:

const int i = 0;

не делает статический (t) статический (в C или С++).