Гипотетический вопрос: Возможно ли иметь программу на C ++, которая содержит директивы препроцессора, целиком в одну строку?
Такая строка будет выглядеть так:
#define foo #ifdef foo #define bar #endif
Какова семантика такой строки?
Кроме того, есть ли какая-либо комбинации директив, которые невозможно построить в одной строке?
Если это зависит от компилятора, то приветствуются ответы как на VC ++, так и на GCC.
Директива препроцессирования должна завершаться новой строкой, поэтому на самом деле это одна директива препроцессирования, определяющая объектоподобный макрос с именем foo
, который расширяется до следующей последовательности лексем:
# ifdef foo # define bar # endif
Любое последующее использование имени foo
в исходном тексте (пока оно не будет #undef
ed) будет расширяться до этого, но после расширения макроса результирующие лексемы не оцениваются как директива препроцессирования.
Это не зависит от компилятора; такое поведение определено стандартами C и C++.
Директивы препроцессора несколько отличаются от операторов языка, которые заканчиваются ;
и используют пробелы для разделения токенов. В случае препроцессора директива завершается новой строкой, поэтому невозможно сделать то, что вы пытаетесь использовать, используя сам язык C ++.
Один из способов смоделировать это - поместить нужные строки в отдельный файл заголовка, а затем #include
там, где вы хотите. Отдельный заголовок по-прежнему должен содержать каждую директиву в одной строке, но точка, в которую вы включаете ее, - это всего лишь одна строка, эффективно выполняющая то, что вы просили.
Другой способ добиться чего-то подобного - иметь файл до C ++, который вы используете внешний процесс для обработки в исходный файл C ++ перед компиляцией с помощью компилятора C ++. Это, вероятно, больше проблем, чем того стоит.