Вопрос по c++, c-preprocessor – Несколько директив препроцессора в одной строке в C ++

10

Гипотетический вопрос: возможно ли иметь программу на C ++, которая содержит директивы препроцессора, целиком в одну строку?

Такая строка будет выглядеть так:

#define foo #ifdef foo #define bar #endif

Какова семантика такой линии?

Кроме того, есть ли комбинации директив, которые невозможно построить в одной строке?

Если это зависит от компилятора, то приветствуются ответы как на VC ++, так и на GCC.

Ваш Ответ

2   ответа
7

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

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

Еще один способ добиться чего-то подобного - это иметь файл, предшествующий C ++, который вы используете для обработки в исходном файле C ++ с помощью внешнего процесса до компиляции с вашим компилятором C ++. Это, вероятно, гораздо больше проблем, чем оно того стоит.

13

й строки, так что это фактически единственная директива предварительной обработки, которая определяет объектоподобный макрос с именемfoo, который расширяется до следующей последовательности токенов:

# ifdef foo # define bar # endif

Любое последующее использование имениfoo в источнике (пока не#undefed) расширится до этого, но после раскрытия макроса полученные токены не будут оцениваться как директива предварительной обработки.

Это не зависит от компилятора; это поведение определяется стандартами C и C ++.

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