Нет, в общем, вы не должны использовать объекты с константой в C для создания констант имен. Для создания именованной константы в C вы должны использовать либо макросы (#define
), либо перечисления. На самом деле, язык Си не имеет констант, в том смысле, который вы подразумеваете. (C значительно отличается от C ++ в этом отношении)
В языке Си понятия константа и константа определены совсем иначе, чем в C ++. В C константа означает буквальное значение , например 123
. Вот несколько примеров констант в C
123
34.58
'x'
Константы в C могут использоваться для построения константных выражений . Однако, поскольку объекты с определенными константами любого типа не являются константами в C, их нельзя использовать в константных выражениях, и, следовательно, вы не можете использовать объекты с константными квалификациями, где требуются постоянные выражения.
Например, следующее не является константой
const int C = 123; /* C is not a constant!!! */
и так как вышеприведенное C
не является константой, его нельзя использовать для объявления типа массива в области видимости файла
typedef int TArray[C]; /* ERROR: constant expression required */
Не может использоваться в качестве метки регистра
switch (i) {
case C: ; /* ERROR: constant expression required */
}
Не может использоваться в качестве ширины битового поля
struct S {
int f : C; /* ERROR: constant expression required */
};
Его нельзя использовать в качестве инициализатора для объекта со статической продолжительностью хранения.
static int i = C; /* ERROR: constant expression required */
Его нельзя использовать как инициализатор перечисления.
enum {
E = C /* ERROR: constant expression required */
};
Т.е. его нельзя использовать где-либо, где требуется константа .
Это может показаться нелогичным, но именно так определяется язык C.
Вот почему вы видите эти многочисленные #define
-ы в коде, с которым вы работаете. Опять же, в языке Си const-квалифицированные объекты имеют очень ограниченное использование. Они практически бесполезны как «константы», поэтому в языке C вы вынуждены использовать #define
или перечисления для объявления истинных констант.
Конечно, в ситуациях, когда объект с квалификацией const работает для вас, то есть он делает то, что вы хотите, он действительно превосходит макросы во многих отношениях, поскольку он имеет область видимости и типизирован. Вероятно, вам следует отдавать предпочтение таким объектам, где это применимо, однако в общем случае вам придется учитывать вышеуказанные ограничения.