Что является стандартом для объявления постоянных переменных в ANSI C? - PullRequest
5 голосов
/ 01 июля 2011

Я учу себя C, перебираю свою книгу по C ++ и записываю проблемы на C. Я хотел бы знать правильный стандартный отраслевой способ объявления констант переменных в C. Вы все еще используете # define директива вне main, или вы можете использовать стиль C ++ const int внутри main?

Ответы [ 4 ]

4 голосов
/ 01 июля 2011

const в C очень отличается от const в C ++.

В C это означает, что объект не будет изменен через этот идентификатор:

int a = 42;
const int *b = &a;

*b = 12; /* invalid, the contents of `b` are const */
a = 12; /* ok, even though *b changed */

Кроме того, в отличие от C ++, const-объекты нельзя использовать, например, в метках переключателей:

const int k = 0;
switch (x) {
    case k: break; /* invalid use of const object */
}

Итак ... это действительно зависит от того, что вам нужно.

Ваши варианты

  • #define: действительно постоянный, но использует препроцессор
  • const: не совсем постоянный
  • enum: ограничено int

пример большего размера

#define CONST 42
const int konst = 42;
enum /*unnamed*/ { fixed = 42 };

printf("%d %d %d\n", CONST, konst, fixed);

/* &CONST makes no sense */
&konst; /* can be used */
/* &fixed makes no sense */
1 голос
/ 01 июля 2011

Modern C поддерживает глобальные переменные #define s и const.Однако #define s обычно предпочтительнее для истинных констант;это потому, что #define s могут быть встроены в место, где они используются, в то время как const глобальные переменные обычно требуют чтения из памяти, особенно если они определены в другой единице перевода.

При этом,сложные константные структуры хорошо подходят для const глобальных переменных - строк, struct s, массивов и т. д.

0 голосов
/ 15 августа 2018

В большинстве современных реализаций компилятор пытается сделать больше, просто обнажая доступ через символ, помещая глобальные переменные const в секции только для чтения. На самом деле это защищает их во многих системах от изменений. Некоторые примеры: segfault в системах Linux и ошибки в Windows или размещение кода во FLASH при использовании микроконтроллеров.

Это, конечно, 100% реализация, но приятно знать, что современные машины с аппаратными средствами защиты памяти и современные компиляторы не только следуют стандарту

0 голосов
/ 01 июля 2011

Стандарт, которого придерживаются в большинстве программ на Си, должен иметь все константы в виде макросов (#define) в отдельном заголовочном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...