Как работает #define, какой тип данных хранит или как его определяет?
Вопрос по коду из книги Брайана Кернигана и Денниса Ритчи, глава 1.4. Именованные константы:
#include <stdio.h>
#define LOWER 0 /* нижняя граница таблицы */
#define UPPER 300 /* верхняя граница */
#define STEP 20 /* размер шага */
/* печать таблицы температур по Фаренгейту и Цельсию */
main ()
{
int fahr;
for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP)
printf ("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}
Какой тип данных хранит #define или как оно его определяет? Просто в printf в данном случае понятно, что сначала выводится целое число, а потом число флоатное, которое является результатом уравнения. Мне не понятно каким образом оно может посчитать данное уравнение, если тип данных переменной farh, которая в нём находится, по моему, не определён? И как всё это связано с #define ? У меня есть предположение по этому поводу, но они не очень ясные и вообще хотелось услышать конкретное пояснение.
Ответы (1 шт):
#define хранит не какие-то типизированные данные, а просто пару "имя-значение". Перед компиляцией все "имена" заменяются на "значения".
Дальше всё делает компилятор так, как будто никаких дефайнов и не было, а с самого начала текст был написан с использованием значений, определенных в #define.
В общем, #define - это тупая подстановка определенного в #define значения вместо определенного в #define же имени по всему коду. Отсюда следует, что вообще в #define можно запихнуть любую дичь, и пример #define true false - это еще довольно невинный пример.
Также, важно понимать, что подстановкой дефайнов занимается не компилятор, а препроцессор. И у него интеллекта при этом не больше, чем у функции replace(). То есть он тупо заменяет всё по тексту.
Использовать это можно, к примеру, так:
#define myint unsigned long long;
myint a = 1099511627776;
ведь правда, писать myint вместо unsigned long long - короче?
А еще в комментариях любезно подсказывают: "Чтобы понять зачем #define нужен, посмотрите сначала про #ifdef. Эта команда очень нужна для компилирования на разные архитектуры процессоров/операционных систем". Вот это - настоящее, а не учебное использование дефайнов.