Краткий ответ:
A const
- это обещание, что вы не будете пытаться изменить значение после его установки.
Переменная static
означает, что время жизни объекта - это полное выполнение программы, и его значение инициализируется только один раз перед запуском программы. Вся статика инициализируется, если вы не указали для них явное значение. Способ и время статической инициализации не указано .
C99 заимствовал использование const
из C ++. С другой стороны, static
был источником многих дискуссий (на обоих языках) из-за его часто сбивающей с толку семантики.
Кроме того, с C ++ 0x до C ++ 11 использование ключевого слова static
не рекомендуется для объявления объектов в области имен. Это устаревание было удалено в C ++ 11 по различным причинам (см. здесь ).
Более длинный ответ: больше о ключевых словах, чем вы хотели знать (прямо из стандартов):
C99
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
/* file scope, static storage, internal linkage */
static int i1; // tentative definition, internal linkage
extern int i1; // tentative definition, internal linkage
int i2; // external linkage, automatic duration (effectively lifetime of program)
int *p = (int []){2, 4}; // unnamed array has static storage
/* effect on string literals */
char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable
char *p = (char []){"/tmp/fileXXXXXX"}; // static, modifiable
const char *cp = (const char []){"/tmp/fileXXXXXX"} // static, non-modifiable
void f(int m)
{
static int vla[ m ]; // err
float w[] = { 0.0/0.0 }; // raises an exception
/* block scope, static storage, no-linkage */
static float x = 0.0/0.0; // does not raise an exception
/* ... */
/* effect on string literals */
char *s = "/tmp/fileXXXXXX"; // static storage always, may not be modifiable
char *p = (char []){"/tmp/fileXXXXXX"}; // automatic storage, modifiable
const char *cp = (const char []){"/tmp/fileXXXXXX"} // automatic storage, non-modifiable
}
inline void bar(void)
{
const static int x = 42; // ok
// Note: Since an inline definition is distinct from the
// corresponding external definition and from any other
// corresponding inline definitions in other translation
// units, all corresponding objects with static storage
// duration are also distinct in each of the definitions
static int y = -42; // error, inline function definition
}
// the last declaration also specifies that the argument
// corresponding to a in any call to f must be a non-null
// pointer to the first of at least three arrays of 5 doubles
void f(double a[static 3][5]);
static void g(void); // internal linkage
C ++
Имеет в основном ту же семантику, за исключением случаев, отмеченных в кратком ответе. Также нет параметров, квалифицирующих static
s.
extern "C" {
static void f4(); // the name of the function f4 has
// internal linkage (not C language
// linkage) and the function’s type
// has C language linkage.
}
class S {
mutable static int i; // err
mutable static int j; // err
static int k; // ok, all instances share the same member
};
inline void bar(void)
{
const static int x = 42; // ok
static int y = -42; // ok
}
Есть еще несколько нюансов C ++ static
, которые я здесь опущу. Взгляните на книгу или стандарт.