Макрорасширение препроцессора к другой директиве препроцессору

Я думаю, что он спрашивает о различии между отделением и промежутком, и действительно нет один, кроме поведения по умолчанию.

Это - вопрос соглашения. Когда использование моделирования, div обычно используется для разграничения подразделений содержания, в то время как span используется для разграничения встроенного текста. Вы могли так же, как легко использовать div везде или использование span везде, но полезно думать о них как отличающихся, даже если это только условно.

8
задан Brian Tompsett - 汤莱恩 12 February 2016 в 09:38
поделиться

3 ответа

Я считаю, что это невозможно сделать, потому что препроцессор однопроходный . Таким образом, он не может генерировать другие директивы препроцессора.

В частности, из стандарта C99 (6.10.3.4 параграф 3):

3 Результат полностью токен предварительной обработки с заменой макроса последовательность не обрабатывается как директива предварительной обработки, даже если она похож на один, ...

Достаточно интересно, именно поэтому в c99 был добавлен унарный оператор _Pragma . Поскольку макрос #pragma не может генерировать макрос, а _Pragma может.

14
ответ дан 5 December 2019 в 06:38
поделиться

Все директивы препроцессора интерпретируются перед раскрытием макроса начинается, поэтому нет, вы не можете развернуть макрос в директиву #include и интерпретировать его как таковой. Вместо этого он будет интерпретирован как (ошибочный) код C ++.

1
ответ дан 5 December 2019 в 06:38
поделиться

Стандарт 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

(который не соответствует ни одной из двух предыдущих форм) разрешен. Предварительная обработка токены после включения в директиву обрабатываются так же, как и в обычном тексте. (Каждый идентификатор, в настоящее время определенный как имя макроса, заменяется его списком замены предварительной обработки токенов.)

10
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: