У меня есть некоторый код, происходящий из DSL, который нужно перевести для вызывающей стороны C ++. Мне нужно выяснить, как сортировать зависимости #include в C ++. К счастью, у меня есть несколько ограничений, которые могут облегчить мою задачу:
- Результат не содержит шаблонов или макросов. Я могу использовать шаблоны или макросы, чтобы облегчить мне жизнь, но DSL явно не генерирует ничего, что требует их - вся предварительная обработка, с этой целью позаботились о генерации кода.
- Полученный код вовсе не обязательно должен быть читаемым или обслуживаемым - он будет создаваться и потребляться программой. Желательно, чтобы это не повлекло за собой ухудшение производительности или не запутало оптимизаторы, но я могу жить, если придется.
Однако мне нужно преобразовать некоторый код, который описывает программы, которые являются допустимыми для C ++, но не могут быть определены, например,
struct X {
Y y;
Y func();
};
struct Y {
X func();
};
// or
struct Y {
void func(X x);
};
struct X {
void func(Y y);
};
Пока что мне пришла в голову мысль, что я бы сделал каждый тип отдельным независимым заголовком, а затем в файле реализации я могу просто #include все типы, от которых зависит реализация, что не будет слишком сложно. Вопрос в том, как я могу изменить код X и Y, чтобы это было возможно.
Прямо сейчас, я подумал о применении RVO и NRVO и о чем-то похожем на аргументы. Но разве бывают случаи, когда они не просто не оптимизированы, но на самом деле невозможны? Это написано в MSVC10, поэтому я могу справиться с любыми дополнительными функциями, которые C ++ 0x может предложить здесь.
Редактировать: я отредактировал свой код, потому что я немного занизил свои потребности. RVO и NRVO также не могут сократить это.
Edit edit: Я предполагаю, что, если предварительных объявлений будет достаточно для возвращаемых значений функции и аргументов, я мог бы топологически отсортировать по порядку включения элементов данных. В конце концов, все еще не разрешено делать что-то вроде
struct X {
Y y;
};
struct Y {
X x;
};