Несколько директив препроцессора в одной строке в C ++

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

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

#define foo #ifdef foo #define bar #endif

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

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

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

12
задан Peter Mortensen 16 March 2017 в 19:38
поделиться

2 ответа

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

# ifdef foo # define bar # endif

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

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

13
ответ дан 2 December 2019 в 18:17
поделиться

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

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

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

7
ответ дан 2 December 2019 в 18:17
поделиться
Другие вопросы по тегам:

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