Как заголовочный файл может безопасно включать стандартные библиотеки для потребителей, чтобы импортировать их

Есть ли какая-то причина, по которой вы не можете использовать alloca () для выделения необходимого пространства в фрейме стека в зависимости от того, насколько большой объект действительно должен быть?

Если вы это сделаете и все равно выложите стек, положите его в выделенную кучу. Я настоятельно рекомендую НЕ объявлять его как static в main () и помещать его в сегмент данных.

Если это действительно так важно, и ваша программа не может выделить его в кучу, ваша программа действительно на самом деле не работает бизнес на этом типе машины.

Что (точно) вы пытаетесь выполнить?

0
задан Johannes 18 January 2019 в 16:29
поделиться

1 ответ

Оба решения хороши, в зависимости от вашей цели.

Включая память и строку

Делая это, вы не нарушаете код, вы заставляете их использовать C ++ 11 или выше для использования вашей библиотеки. Тем не менее, я считаю это плюсом, так как вам не нужно возиться с множеством ухищрений для поддержки C ++ 98.

При компиляции кода они не должны связываться со стандартной библиотекой, поэтому, если они сделают что-то вроде #defined unique_ptr shared_ptr, я обвиню ваших пользователей в плохом кодировании, а не вас. И да, вы можете попытаться защитить от множества плохих вещей, сделанных пользователями, таких как перегрузка operator& (адрес), однако вы получите код, подобный реализациям STL, который тоже не очень хорош. [ 1114]

Использование pimpl

Использование pimple решает множество проблем, упомянутых выше. Тем не менее, вы не должны использовать его из-за этого. Единственное реальное преимущество pimple - двоичная совместимость.

Поскольку вы не выставляете STL или любые другие библиотеки, кроме своей собственной, вы не должны получать ошибки ссылок на std::string. (Да, это возможно)

Если вы компилируете свою библиотеку с libc++, то std::string на самом деле std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > с макетом памяти, специфичным для libcxx.

Если вы компилируете свою библиотеку с libstdc++, std::string становится std::basic_string<char, std::char_traits<char>, std::allocator<char> > (или более длинным именем для варианта C ++ 11)

См. этот поток для получения дополнительной информации детали

0
ответ дан JVApen 18 January 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: