Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Как задать тип константы в Си?

#c


К примеру, в программе (для экономия места) я использую символьный массив для хранения
и операций над значениями. При этом есть одно число: 9 - которое имеет важное значение,
и которое, в целях практичности мне нужно записать как константу 

#define SIZE 9


При этом, насколько я сумел понять из учебника, эта константа будет иметь тип int.
В результате при операциях с этим значением будет все время использоваться приведение
типа к int. Это меня не устраивает - я хочу знать, можно ли явно задать тип (символьный)
такой константе?
    


Ответы

Ответ 1



Тип литерала в #define (и в любом другом месте) задается неявно и определяется тем значением, что вы укажете. 9 имеет тип int, '9' - тоже int, но соответствующий отличному от предыдущей ситуации значению (об этом далее), "9" - char[2] (строковый литерал, в котором один символ это '9', а второй - терминирующий ноль '\0'), 9.0 будет иметь тип double, 9.f - float и т.д. В любом случае для #define вы задаете то значение, которое можно будет использовать в нужном контексте. Хотя здесь и возможны ситуации, когда компилятор молча проглотит, казалось бы, ошибочное значение. Например, при попытке задать массив: #define N '9' int A[N]; вы получите массив из 57 элементов (соответствует ASCII коду символа '9'), а не из 9 элементов. В общем, чтобы понять более точно вашу проблему, хорошо бы увидеть конкретный пример, почему требуется явно указать какой-то специфический тип для дефайна.

Ответ 2



Смотрите как работает define, самый первый этап компиляции это препроцессинг, везде где встречается ваша директива 'SIZE', она будет заменена на 9, а только потом будет компиляция, линковка.. Вы можете написать туда что угодно в рамках синтаксиса, это будет работать как если бы в блокноте произвели поиск и замену.

Ответ 3



Можно так: #define SIZE (static_cast(9)); Мне подобное приведение требовалось при сборке пакета для отправки данных железу.

Комментариев нет:

Отправить комментарий