Сравните символическую константу, перечисление, постоянную переменную - PullRequest
1 голос
/ 13 сентября 2010

символическая константа - без проверки типа-> значение просто подставлено
перечисление - более безопасный тип, чем символическая константа
постоянные переменные - наиболее безопасный тип

Что-нибудь еще, что можно добавить здесь?
Есть ли разница с точки зрения занимаемого ими пространства?

Ответы [ 3 ]

3 голосов
/ 13 сентября 2010
  • Символические константы (с #define): нет проверки в точке определения. Нормальная проверка выполняется в момент использования после текстовой замены. Может использоваться для констант любого базового типа (в C99, даже для неосновных типов)

  • Перечисление: может содержать только целые числа, и это проверяется в точке определения.

  • const -качественные переменные: в действительности не являются константами в C, но должны рассматриваться как переменные «только для чтения». Так как на самом деле это не константа, их нельзя использовать там, где язык требует константы.

Переменные (даже если они «только для чтения») должны предполагать, что они занимают память. Можно предположить, что перечислители и #define производят постоянные значения, которые вставляются непосредственно в код. То, насколько это действительно так, зависит также от типа константы и возможностей процессора для обработки этих констант.

Что касается безопасности типов, то здесь не так много различий. За исключением того, что компилятор будет жаловаться громче, если вы попытаетесь инициализировать перечислитель нецелым числом.

На практике перечисления чаще всего используются для групп целочисленных констант, которые тесно связаны, а #define используются практически для всего остального.

1 голос
/ 13 сентября 2010

Символьные константы проходят некоторую проверку типов, обычно компилятор скажет вам, является ли константа слишком большой, чтобы поместиться в место, где вы ее присваиваете

Константы перечисления вообще не проверяют типы, поскольку они просто int.В отличие от этого переменные типа перечисления могут получить некоторую проверку типа и диапазона.

Нет такой вещи, как постоянные переменные, вы, вероятно, имеете в виду const квалифицированные переменные.Да, они безопасны, но не являются константами в том, как C понимает слово константа.Думайте о них лучше как unmutable или invariant.

Константы в смысле C не занимают места, они просто символические значения, необходимые во время компиляции, нет объектов, которые соответствуют им во время компиляциивыполнение.

0 голосов
/ 13 сентября 2010

Я бы лично выбрал перечисление -> дал бы вам возможность объявлять константы и все еще может использоваться с такими конструкциями, как: XmlStatusesEnum :: XML_FILE_OK.

...