Передача переменных в #include через #define - PullRequest
1 голос
/ 23 января 2010

Можно ли что-то сделать по следующим направлениям:

#define import_and_other(s)\
something\
#include s

такой, что:

import_and_other("file.h")

становится:

something
#include "file.h"

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

Ответы [ 3 ]

2 голосов
/ 23 января 2010

Нет!

Стандарт C99 гласит (раздел 6.10.2):

Директива предварительной обработки вида

# include pp-tokens new-line

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

Однако есть другое правило (раздел 10.6.3.2, «Оператор #»), которое гласит:

Каждый токен предварительной обработки # в списке замены для функционально-подобного макроса должен быть с последующим параметром в качестве следующего токена предварительной обработки в списке замен.

«#include s» в раскрытии макроса не соответствует этому ограничению - слово «include» не является параметром для макросоподобной функции.

Это не позволяет вам генерировать (пригодную для использования) директиву #include. В любом случае, во время раскрытия макроса существует другое правило (раздел 10.6.3.4), которое гласит:

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

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

К сожалению, ваши усилия обречены на провал.

1 голос
/ 23 января 2010

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

1 голос
/ 23 января 2010

Нет, но вы можете сделать свой собственный включаемый файл, который выполняет оба действия, а затем #include его. Назовите заголовочный файл с именем import_and_other по вашему выбору. Текст замены #define - примечание, ДЕЙСТВИТЕЛЬНО многострочное, оно просто обернуто для вашего удобства.

...