Если я определяю структуры на уровне модуля, я могу ссылаться на еще не определенные структуры.Порядок объявления структуры
struct S {
ComesLater c;
}
struct ComesLater {}
Но если я сделать то же самое внутри unittest
или функционального блока, он не работает:
unittest {
struct S {
ComesLater c;
}
struct ComesLater {}
}
Error: undefined identifier 'ComesLater'
Почему? Как я могу получить независимые от заказа объявления внутри функций? Есть ли какая-то декларация вперед в d? Мне нужно это, потому что я сгенерирую структуры с помощью mixin и упорядочивая объявления в порядке их внутренних зависимостей, было бы довольно сложным, а иногда и невозможным, если бы существовали циркулярные ссылки на структуры. (с использованием указателей.)
Ницца! Боюсь, я не смогу использовать это обходное решение, потому что я мог бы генерировать несколько блоков таких структур внутри одной области, и это работает только один раз. (Тогда Holder будет уже определен.) Разве нет никакой возможности, чтобы вы могли получить какую-то декларацию вперед? Или определить блок кода, который не имеет порядка выполнения внутри, но не меняет текущую область? (Подобно Holder.) – Tamas
Я смог поместить структуры внутри шаблона mixin Foo() {static struct S {C c; } static struct C {}} ', тогда вызов' mixin Foo!(); 'Затем я получаю независимый блок заказа без дополнительного держателя! =) – Tamas
Ну, вы всегда можете изменить имя при каждом его создании. Holder, Lynch, Mukasey, Gonzales :) или Holder1, Holder2. Трюк __LINE__ может помочь вам создавать уникальные имена внутри кода генерации строки mixin.Вы также можете попытаться сделать держателем «mixin template» вместо «struct», а затем смешать его сразу после объявления, чтобы его символы вводились в родительскую область. –