В чем разница между static const и const?
Например:
static const int a=5;
const int i=5;
Есть ли разница между ними?
Когда вы будете использовать один над другим?
Ответ 1
Разница заключается в связи.
// At file scope
static const int a=5; // internal linkage
const int i=5; // external linkage
Если объект i не используется вне единицы перевода, где он определен, вы должны объявить его с помощью спецификатора static.
Это позволяет компилятору (потенциально) выполнять дальнейшие оптимизации и информирует читателя о том, что объект не используется вне его единицы перевода.
Ответ 2
static определяет видимость вне функции или продолжительность жизни переменных внутри. Таким образом, это не имеет никакого отношения к const per se.
const означает, что вы не изменяете значение после его инициализации.
static внутри функции означает, что переменная будет существовать до и после завершения функции.
static вне функции означает, что область действия символа, помеченного static, ограничена этим .c файлом и не может быть замечена вне его.
Технически (если вы хотите посмотреть это), static - спецификатор хранилища, а const - спецификатор типа.
Ответ 3
Это зависит от того, находятся ли эти определения внутри функции или нет. Ответ на случай, выходящий за пределы функции, указан выше. Внутри функции эффект различен, как показано на следующем примере:
#include <stdlib.h>
void my_function() {
const int foo = rand(); // Perfectly OK!
static const int bar = rand(); // Compile time error.
}
Если вы хотите, чтобы локальная переменная была "действительно постоянной", вы должны определить ее не только "const", но и "static const".