У меня есть модуль D, который, я надеюсь, содержит общедоступную и приватную части. Я пытался использовать ключевые слова private и static перед определениями функций. У меня есть функция, которую я хочу сделать доступной/общедоступной извне, и в идеале я хотел бы, чтобы она была встроена в сайт вызова. Эта функция вызывает другие внутренние функции модуля, которые должны быть закрытыми, то есть не вызываемыми извне. Вызовы к ним успешно встраиваются в модуль, и большая часть мусора устраняется CTFE плюс распространение известных констант. Однако компилятор GDC также генерирует копии этих внутренних подпрограмм, даже если они встроены там, где это необходимо, и не должны вызываться извне. Я компилирую с -O3 -frelease. Что я должен делать - должен ли я ожидать этого, даже если я использую static и/или private?
Я также кратко рассмотрел этот поток , касающийся GCC, в надежде на на виду.
Как я упоминал ранее, я пытался использовать как private, так и static для этих внутренних функций, но мне не удалось подавить генерацию кода. Я мог бы понять это, если бы отладчик нуждался в копиях этих подпрограмм для установки точек останова. Я должен подчеркнуть, что это, возможно, можно как-то решить во время компоновки, насколько мне известно. Я не пытался связать программу, я просто смотрю на сгенерированный код в Matt Godbolt D Compiler Explorer с помощью GDC. Все можно превратить в шаблоны со списком параметров шаблона нулевой длины (например, auto my_fn()(in arg_t x)), пробовал, не помогает, но и не вредит.
Еще пара вещей, которые можно попробовать: я мог бы попытаться создать статический класс с закрытыми частями, как способ реализации пакета в стиле Ады. (Должно быть строго в одном экземпляре.) Я никогда не занимался C++, только огромное количество ассемблера и C профессионально. Так что это будет кривая обучения.
Единственное, что я могу придумать, это использовать определения вложенных функций в стиле Pascal/Ada, переместить внутренние подпрограммы внутрь тела вызывающих их функций. Но в этом есть масса минусов.
Грубый пример
module junk;
auto my_public_fn() { return my_private_fn(); }
private
static // 'static' and/or 'private', tried both
auto my_private_fn() { xxx ; return whatever; }
static
. это не имеет значения в объявлениях верхнего уровня. - person Cauterite   schedule 28.02.2017