Как преобразовать строковый литерал .rdata в строковый литерал в стеке во время компиляции ⇐ C++
-
Anonymous
Как преобразовать строковый литерал .rdata в строковый литерал в стеке во время компиляции
Я пишу позиционно-независимый код, поэтому мне нужно, чтобы все строки помещались в стек, а не в раздел PE .rdata. Этого можно добиться, используя массив символов вместо строкового литерала:
char str[] = {'s', 't', 'r', 'i', 'n', 'g', '\0' }; Но это очень неудобно.
Можно ли использовать какие-либо приемы метапрограммирования, позволяющие использовать строковые литералы путем преобразования их в массив в стеке во время компиляции?
Возможно, этого можно достичь, используя std::initializer_list в качестве возвращаемого типа или передавая строку в качестве нетипового параметра шаблона, пакетов параметров. Основная проблема, с которой я столкнулся при использовании разных подходов, — это невозможность вернуть массив как тип возвращаемого значения, не помещая его в .rdata или в кучу.
Было бы здорово реализовать такой синтаксис, используя определяемые пользователем строковые литералы.
auto str = "string"_onstack; Также разрешены __forceinline или любые расширения компилятора msvc/clang.
Я пишу позиционно-независимый код, поэтому мне нужно, чтобы все строки помещались в стек, а не в раздел PE .rdata. Этого можно добиться, используя массив символов вместо строкового литерала:
char str[] = {'s', 't', 'r', 'i', 'n', 'g', '\0' }; Но это очень неудобно.
Можно ли использовать какие-либо приемы метапрограммирования, позволяющие использовать строковые литералы путем преобразования их в массив в стеке во время компиляции?
Возможно, этого можно достичь, используя std::initializer_list в качестве возвращаемого типа или передавая строку в качестве нетипового параметра шаблона, пакетов параметров. Основная проблема, с которой я столкнулся при использовании разных подходов, — это невозможность вернуть массив как тип возвращаемого значения, не помещая его в .rdata или в кучу.
Было бы здорово реализовать такой синтаксис, используя определяемые пользователем строковые литералы.
auto str = "string"_onstack; Также разрешены __forceinline или любые расширения компилятора msvc/clang.
Мобильная версия