Как работает #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 шт):

Автор решения: S.H.

#define хранит не какие-то типизированные данные, а просто пару "имя-значение". Перед компиляцией все "имена" заменяются на "значения".

Дальше всё делает компилятор так, как будто никаких дефайнов и не было, а с самого начала текст был написан с использованием значений, определенных в #define.

В общем, #define - это тупая подстановка определенного в #define значения вместо определенного в #define же имени по всему коду. Отсюда следует, что вообще в #define можно запихнуть любую дичь, и пример #define true false - это еще довольно невинный пример.

Также, важно понимать, что подстановкой дефайнов занимается не компилятор, а препроцессор. И у него интеллекта при этом не больше, чем у функции replace(). То есть он тупо заменяет всё по тексту.

Использовать это можно, к примеру, так:

    #define myint unsigned long long;
    myint a = 1099511627776;

ведь правда, писать myint вместо unsigned long long - короче?

А еще в комментариях любезно подсказывают: "Чтобы понять зачем #define нужен, посмотрите сначала про #ifdef. Эта команда очень нужна для компилирования на разные архитектуры процессоров/операционных систем". Вот это - настоящее, а не учебное использование дефайнов.

→ Ссылка