Проблема, с которой я столкнулся, проиллюстрирована в следующем коде.
#include <iostream>
#define X 4
int main()
{
std::cout << "should be 4: " << X << std::endl;
#define Y X + 4
std::cout << "should be 8: " << Y << std::endl;
#undef Y
#define Y X+0
#undef X
#define X Y+1
std::cout << "expecting 5: " << X << std::endl;
}
Ошибка:
test2.cc: In function ‘int main()’:
test2.cc:17: error: ‘X’ was not declared in this scope
Шаблон, который я пытаюсь эмулировать, расширяет программу при коде / сборкеуровень (очень похоже на то, как модули nginx подключены во время компиляции ).Мне нужно создать расширяемую структуру времени компиляции, которая является расширяемой (подключаемой) путем добавления #include
s в мою сборку, что приводит к вектору boost-mpl с уникальным именем, содержащим все мои плагины.Поэтому, если X
является уникальным конечным именем, X_0, X_1, X_2 являются именами, которые создаются по пути, поскольку к вектору применяется mpl-вектор push_back
.
I ЗНАЮ абстракции boost :: препроцессора являются ключевыми, но я пока не хочу выделять время на его изучение, так как я создаю прототип той части системы, котораяв конечном итоге будет модульным во время компиляции.
Итак, для дальнейшего использования,
- Почему я получаю ошибку выше?
- Как должен выглядеть правильный необработанный шаблон препроцессора.
- Как выглядит правильный шаблон boost-preprocessor-library.