Проблема построения Boost::log::string_literal

Я безуспешно пытаюсь использовать макрос BOOST_LOG_NAMED_SCOPE без жесткого кодирования (например, без BOOST_LOG_NAMED_SCOPE("bla"), но BOOST_LOG_NAMED_SCOPE(some_variable); этот макрос использует внутри boost::log::string_literal, у которого нет C'tor для std::string или char*. Единственное, что он принимает, это const char[] (НЕ const char* ) - что мне совсем не помогает, потому что я не могу его жестко запрограммировать - это значение должно быть получено из функции.

Итак, мне нужно найти способ построить boost::log::string_literal с std::string или char*, или как-то отредактировать const char[]... (Я также пытался создать char[] и преобразовать его в const char[], но не удалось)


person o.z    schedule 02.06.2014    source источник


Ответы (1)


эм. «Строковый литерал» говорит сам за себя. Он будет работать только с литералами, а те являются по определению (то есть в стандарте) char const[].

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

Таким образом, вы можете не захотеть жестко кодировать вещи, но вы не можете использовать макросы, для которых требуется строковый литерал.

Теперь вы можете использовать extern переменных соответствующего типа (extern char const some_scope_name[]), что, как я полагаю, по крайней мере даст вам возможность определить значение в другой единице перевода.

person sehe    schedule 02.06.2014
comment
Tnx. Причина, по которой мне это нужно, заключается в том, чтобы вести журнал только с именем файла (а не с полным путем, как дает атрибут области). Думаю, я сделаю это с помощью специальной formatter-функции (используя boost::bind, чтобы привязать его к приемнику), или я буду использовать макрос имени файла для каждого файла в проекте (я напишу его вручную или через скрипт) и используйте BOOST_LOG_NAMED_SCOPE - person o.z; 03.06.2014