Как я могу использовать всего одну библиотеку/файл повышения? [дубликат]

Первый пример: Несколько безопасный

char* const GetString()
{
  static char sTest[5];
  strcpy(sTest, "Test");
  return sTest;
}

, Хотя не рекомендуемый, это безопасно, объем статической переменной остается живым, даже когда объем функции заканчивается. Эта функция не очень ориентирована на многопотоковое исполнение вообще. Лучшая функция заставила бы Вас передавать char* buffer и maxsize для эти GetString() функция для заполнения.

, В частности, эту функцию не рассматривают повторно используемая функция , потому что повторно используемые функции не должны среди других вещей, возвращают адрес статическим (глобальным) непостоянным данным . См. повторно используемые функции .

Второй пример: Абсолютно небезопасный

char* const GetString()
{
  return "Test";
}

Это было бы безопасно, если бы Вы сделали const char *. То, что Вы дали, не безопасно. Причина состоит в том, потому что строковые литералы могут быть сохранены в сегменте постоянной памяти, и разрешение им быть измененным вызовет неопределенные результаты.

char* const (указатель константы) означает, что Вы не можете изменить адрес, на который указывает указатель. const char * (указатель на константу) означает, что Вы не можете изменить элементы, на которые указывает этот указатель.

Заключение:

необходимо рассмотреть также:

1), Если у Вас есть доступ к коду тогда, изменяют GetString для взятия параметра char* buffer для заполнения и maxsize для использования.

2), Если у Вас нет доступа к коду, но необходимо назвать его, обернуть этот метод в другую функцию, которая защищена взаимным исключением. Новый метод как описан в 1.

9
задан Community 23 May 2017 в 11:53
поделиться

6 ответов

Boost got a very nice tool called bcp which does what you want. check it out.

from the docs:

bcp boost/regex.hpp /foo

Copies boost/regex.hpp and all dependencies including the regex source code 
(in libs/regex/src) and build files (in libs/regex/build) to /foo.  Does not
copy the regex documentation,  test, or example code.
24
ответ дан 4 December 2019 в 06:30
поделиться

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

В моем текущем проекте этот путь включения :

/I "C:\Program Files\boost\boost_1_39"

Мой код включает такие заголовки:

#include <boost/random.hpp>

boost / random.hpp содержит несколько строк вроде #include "boost / random / linear_congruential.hpp" , поэтому вам нужно путь включения.

7
ответ дан 4 December 2019 в 06:30
поделиться

Большая часть Boost распространяется как библиотеки «только для заголовков» - это означает, что вам не нужно «создавать» что-либо, чтобы использовать эту библиотеку. Random - один из них, поэтому можно просто включить правильные файлы заголовков, и вы будете смеяться. Я бы сказал, что лучше всего где-то получить весь источник повышения и указать на это, поскольку разные части имеют тенденцию иметь некоторые зависимости друг от друга.

4
ответ дан 4 December 2019 в 06:30
поделиться

Да, большинство библиотек ускорения являются только заголовком, поэтому вам не нужно компилировать исходные файлы.

1
ответ дан 4 December 2019 в 06:30
поделиться

Да, чтобы использовать boost :: random , вы можете просто включить заголовок в свой исходный файл.

Поскольку Boost широко использует шаблоны, многие библиотеки реализованы исключительно в заголовках (и файлах реализации шаблонов, как txx ).

Большинство библиотек также независимы, так что вы можете использовать только одну, не зависимо от другой. (Исключения задокументированы.)

Если вы посмотрите список библиотек Boost , вы увидите, что многие из них помечены как «Только заголовок», поэтому нет дополнительных библиотек, с которыми можно было бы связываться.

1
ответ дан 4 December 2019 в 06:30
поделиться

how I would go about just using this and only this library

I am not sure what your concern is here. Even if you included other headers, and/or linked other libraries, your final executable will include only those parts of the library needed to resolve symbols in your code. It will not throw in unused object modules. Inlined code and templates in headers are not instantiated unless they are referenced.

Since Boost is primarily a template library and to work around lack of template awareness in most linkers, the code is inlined in the header file, the instantiated templates are compiled into the each object module in which it is instantiated. So you may end up with duplicate code in multiple modules, which if executable size if your concern, you should perhaps be aware of.

0
ответ дан 4 December 2019 в 06:30
поделиться
Другие вопросы по тегам:

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