Я думаю, что он спрашивает о различии между отделением и промежутком, и действительно нет один, кроме поведения по умолчанию.
Это - вопрос соглашения. Когда использование моделирования, div
обычно используется для разграничения подразделений содержания, в то время как span
используется для разграничения встроенного текста. Вы могли так же, как легко использовать div
везде или использование span
везде, но полезно думать о них как отличающихся, даже если это только условно.
Я считаю, что это невозможно сделать, потому что препроцессор однопроходный . Таким образом, он не может генерировать другие директивы препроцессора.
В частности, из стандарта C99 (6.10.3.4 параграф 3):
3 Результат полностью токен предварительной обработки с заменой макроса последовательность не обрабатывается как директива предварительной обработки, даже если она похож на один, ...
Достаточно интересно, именно поэтому в c99 был добавлен унарный оператор _Pragma
. Поскольку макрос #pragma
не может генерировать макрос, а _Pragma
может.
Все директивы препроцессора интерпретируются перед раскрытием макроса начинается, поэтому нет, вы не можете развернуть макрос в директиву #include и интерпретировать его как таковой. Вместо этого он будет интерпретирован как (ошибочный) код C ++.
Стандарт C говорит о директивах предварительной обработки (C99 - 6.10 (2) - Директивы предварительной обработки):
Директива предварительной обработки состоит из последовательности токенов предварительной обработки, которая начинается с токен предварительной обработки #, который (в начале фазы трансляции 4) ...
и (C99 - 6.10 (7)):
Токены предварительной обработки в директиве предварительной обработки не подвергаются макросу расширение, если не указано иное.
ПРИМЕР В:
#define EMPTY ПУСТО # include
последовательность токенов предварительной обработки во второй строке не является директивой предварительной обработки, потому что она не начинается с символа # в начале фазы трансляции 4, даже если это произойдет после замены макроса EMPTY
Итак, нет, макросы не могут расширяться до директивы предварительной обработки ' #include
'. Эти директивы должны быть на месте в начале фазы трансляции 4 (при обработке этих директив происходит предварительная обработка). Поскольку расширение макросов происходит во время фазы 4, макросы не могут вызвать что-то существующее в начале фазы 4.
Однако я хотел бы отметить, что следующее действительно работает:
#ifdef WIN32
#define PLATFORM_HEADER "platform/windows/platform.h"
#else
#define PLATFORM_HEADER "platform/linux/platform.h"
#include PLATFORM_HEADER
потому что стандарт C говорит это (C99, 6.10.2 (4) - включение исходного файла):
Директива предварительной обработки в форме
# include pp-tokens new-line
(который не соответствует ни одной из двух предыдущих форм) разрешен. Предварительная обработка токены после включения в директиву обрабатываются так же, как и в обычном тексте. (Каждый идентификатор, в настоящее время определенный как имя макроса, заменяется его списком замены предварительной обработки токенов.)