Почему 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 или С++).