Jaka jest różnica między static const
i const
? Na przykład:
static const int a=5;
const int i=5;
Czy jest między nimi jakaś różnica? Kiedy użyłbyś jednego nad drugim?
Jaka jest różnica między static const
i const
? Na przykład:
static const int a=5;
const int i=5;
Czy jest między nimi jakaś różnica? Kiedy użyłbyś jednego nad drugim?
Odpowiedzi:
Różnica polega na połączeniu.
// At file scope
static const int a=5; // internal linkage
const int i=5; // external linkage
Jeśli i
obiekt nie jest używany poza jednostką tłumaczeniową, w której jest zdefiniowany, należy zadeklarować go ze static
specyfikatorem.
Umożliwia to kompilatorowi (potencjalnie) wykonanie dalszych optymalizacji i informuje czytelnika, że obiekt nie jest używany poza jego jednostką tłumaczeniową.
const int i = 5;
ma zewnętrzny link? W C ++ to nie ...
const
nie ma nic wspólnego z C ++ const
.
static
określa widoczność poza funkcją lub długość życia zmiennych wewnątrz. Więc nie ma to nic wspólnego z samym sobą const
.
const
oznacza, że nie zmieniasz wartości po jej zainicjowaniu.
static
wewnątrz funkcji oznacza, że zmienna będzie istnieć przed i po zakończeniu funkcji.
static
poza funkcją oznacza, że zakres zaznaczonego symbolu static
jest ograniczony do tego pliku .c i nie można go zobaczyć poza nim.
Z technicznego punktu widzenia (jeśli chcesz to sprawdzić) static
jest specyfikatorem magazynu i const
kwalifikatorem typu.
const int i = 5;
wartość i, którą można modyfikować za pomocą wskaźnika, jeśli i jest zdefiniowane i zadeklarowane lokalnie, jeśli jest stałą statyczną int a = 5; lub const int i = 5; globalnie nie można modyfikować, ponieważ jest przechowywany w pamięci RO w segmencie danych.
#include <stdio.h>
//const int a=10; /* can not modify */
int main(void) {
// your code goes here
//static const int const a=10; /* can not modify */
const int a=10;
int *const ptr=&a;
*ptr=18;
printf("The val a is %d",a);
return 0;
}
Zależy to od tego, czy te definicje znajdują się wewnątrz funkcji, czy nie. Odpowiedź na przypadek poza funkcją daje ouah powyżej. Wewnątrz funkcji efekt jest inny, co ilustruje poniższy przykład:
#include <stdlib.h>
void my_function() {
const int foo = rand(); // Perfectly OK!
static const int bar = rand(); // Compile time error.
}
Jeśli chcesz, aby zmienna lokalna była „naprawdę stała”, musisz ją zdefiniować nie tylko jako „stała”, ale „stała statyczna”.
foo
gdy zmienna jest ponownie inicjalizowana przy każdym my_function()
wywołaniu, co skutkuje przypisaniem innej wartości losowej. W przypadku bar
zmiennej inicjowanej tylko raz, my_function()
wywoływana jest po raz pierwszy, co skutkuje przypisaniem tej samej wartości przez cały czas życia programu. Stąd statyczny czas przechowywania.
bar
ponieważ rand()
nie jest to stała czasu kompilacji.