У чому різниця між статичним const і const?


84

У чому різниця між static constі const? Наприклад:

Чи є якась різниця між ними? Коли б ви використовували одне над іншим?



5
Проголосували за відкриття. "Дублікат" задає зовсім інше питання, характерне для використання пам'яті. Це питання задає більш загальне питання про різницю.
rmaddy

Відповіді:


58

Різниця полягає у зв’язку.

Якщо iоб'єкт не використовується поза блоком перекладу, де він визначений, вам слід оголосити його за допомогою staticспецифікатора.

Це дозволяє компілятору (потенційно) виконувати подальшу оптимізацію та повідомляє читачеві, що об'єкт не використовується поза його блоком перекладу.


8
+1 Було б чудово, якби ви також могли додати, що це означає, якщо ці декларації знаходяться в межах функції.
Преторіан,

Ви впевнені, що const int i = 5;має зовнішній зв'язок ?? У C ++ це не ...
Kerrek SB

4
@KerrekSB у діапазоні файлів, так. (C99, 6.2.2p5) "Якщо оголошення ідентифікатора об'єкта має обсяг файлу і не має специфікатора класу сховища, його зв'язок є зовнішнім."
оу,

13
@KerrekSB: C та C ++ - це не одна мова. Зокрема, C constне має нічого спільного з C ++ const.
R .. GitHub СТОП ДОПОМОГАЙ ЛЕД

Чи справді компілятори оптимізують на основі статики? Здається, не можна вважати безпечним припустити, що статичний об'єкт не використовується поза його блоком перекладу, оскільки він все ще може бути переданий нестатичною функцією або вказаний нестатичним глобальним покажчиком.
nw.

99

staticвизначає видимість поза функцією або тривалістю життя змінних всередині. Отже, це не має нічого спільного constяк таке.

const означає, що ви не змінюєте значення після його ініціалізації.

static усередині функції означає, що змінна буде існувати до і після закінчення функції.

staticза межами функції означає, що область позначеного символу staticобмежена цим файлом .c і не може бути видно за його межами.

Технічно (якщо ви хочете це переглянути), staticце специфікатор сховища та constє кваліфікатором типу.


0

const int i = 5;
значення, яке ви можете змінити, використовуючи покажчик, якщо i визначено та оголошено локально, якщо це статичний const int a = 5; або const int i = 5; глобально, ви не можете змінити, оскільки він зберігається в пам’яті RO в сегменті даних.


-1

Це залежить від того, чи є ці визначення всередині функції чи ні. Відповідь на випадок поза функцією дається ouah, вище. Всередині функції ефект відрізняється, проілюстровано на прикладі нижче:

Якщо ви хочете, щоб локальна змінна була "дійсно постійною", вам потрібно визначити її не просто "const", а "static const".


Він ідеально компілюється для мене ... Але я знаю, що дурно мати статичну змінну const у цьому випадку.
DrumM

1
@DrumM це не дурно. У випадку, fooколи змінна повторно ініціалізується кожен раз, коли my_function()викликається, в результаті чого призначається інше випадкове значення. У випадку, barколи змінна ініціалізується лише один раз, my_function()викликається перший раз, в результаті чого одне і те ж значення призначається протягом усього терміну дії програми. Звідси статична тривалість зберігання.
jb

1
Насправді, при подальшому роздумі, це залежить від того, чи ми використовуємо C або C ++. Питання позначено тегом C, і в цьому випадку ми отримуємо помилку компіляції для призначення, barоскільки rand()не є константою часу компіляції.
jb

1
@nibot, чи можете ви пояснити, що ви маєте на увазі під "ефектом різний" та "дійсно постійним" з посиланням на специфікацію сховища та кваліфікацію типу?
jb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.