У чому різниця між static const
і const
? Наприклад:
static const int a=5;
const int i=5;
Чи є якась різниця між ними? Коли б ви використовували одне над іншим?
У чому різниця між static const
і const
? Наприклад:
static const int a=5;
const int i=5;
Чи є якась різниця між ними? Коли б ви використовували одне над іншим?
Відповіді:
Різниця полягає у зв’язку.
// At file scope
static const int a=5; // internal linkage
const int i=5; // external linkage
Якщо i
об'єкт не використовується поза блоком перекладу, де він визначений, вам слід оголосити його за допомогою static
специфікатора.
Це дозволяє компілятору (потенційно) виконувати подальшу оптимізацію та повідомляє читачеві, що об'єкт не використовується поза його блоком перекладу.
const int i = 5;
має зовнішній зв'язок ?? У C ++ це не ...
const
не має нічого спільного з C ++ const
.
static
визначає видимість поза функцією або тривалістю життя змінних всередині. Отже, це не має нічого спільного const
як таке.
const
означає, що ви не змінюєте значення після його ініціалізації.
static
усередині функції означає, що змінна буде існувати до і після закінчення функції.
static
за межами функції означає, що область позначеного символу static
обмежена цим файлом .c і не може бути видно за його межами.
Технічно (якщо ви хочете це переглянути), static
це специфікатор сховища та const
є кваліфікатором типу.
const int i = 5;
значення, яке ви можете змінити, використовуючи покажчик, якщо i визначено та оголошено локально, якщо це статичний const int a = 5; або const int i = 5; глобально, ви не можете змінити, оскільки він зберігається в пам’яті RO в сегменті даних.
#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;
}
Це залежить від того, чи є ці визначення всередині функції чи ні. Відповідь на випадок поза функцією дається ouah, вище. Всередині функції ефект відрізняється, проілюстровано на прикладі нижче:
#include <stdlib.h>
void my_function() {
const int foo = rand(); // Perfectly OK!
static const int bar = rand(); // Compile time error.
}
Якщо ви хочете, щоб локальна змінна була "дійсно постійною", вам потрібно визначити її не просто "const", а "static const".
foo
коли змінна повторно ініціалізується кожен раз, коли my_function()
викликається, в результаті чого призначається інше випадкове значення. У випадку, bar
коли змінна ініціалізується лише один раз, my_function()
викликається перший раз, в результаті чого одне і те ж значення призначається протягом усього терміну дії програми. Звідси статична тривалість зберігання.
bar
оскільки rand()
не є константою часу компіляції.