Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Модератор
Эксперт Java
2694 / 1193 / 386
Регистрация: 11.08.2017
Сообщений: 3,688
Записей в блоге: 2
1

Странный код не собирающийся clang-ом

15.05.2023, 11:53. Показов 345. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решил поиграться с apache log4cxx. Ради интереса решил собрать с помощью clang (а именно clang-cl). Библиотека использует с++17 и студийным (msvc) компилятором собирается без проблем, с теми же настройками. Уже собранная библиотека (как зависимость) в проекте собирается без проблем с помощью clang
При сборке ругается
Код
error: explicit instantiation of 'shared_ptr' not in a namespace enclosing 'std'
место в коде куда ссылается
C++
1
2
// Instantiate template pointer types passed as parameters
LOG4CXX_INSTANTIATE_EXPORTED_PTR(log4cxx::spi::Filter);
и содержимое этого макроса
C++
1
#define LOG4CXX_INSTANTIATE_EXPORTED_PTR(T) template class LOG4CXX_EXPORT std::shared_ptr<T>
LOG4CXX_EXPORT в данном случае макро раскрывающееся в пустоту, возможный вариант __declspec(dllexport)
Как это исправить? Я не понимаю что тут происходит, так как такой конструкции с template не встречал. Гугл особо не помогает, нашел статью что так делать не стоит, это если по ошибке гуглить, а что это за тема не пойму.
IDE подсказывает что макро раскрывается в
C++
1
2
template
class std::shared_ptr<log4cxx::spi::Filter>
В моем понимании после template должно идти <...>, пусть даже со специализацией
Я пока временно исправил так, но думаю что это не правильно
C++
1
#define LOG4CXX_INSTANTIATE_EXPORTED_PTR(T) LOG4CXX_EXPORT std::shared_ptr<T>
Странно что этот макрос используется без использования в коде в дальнейшем.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2023, 11:53
Ответы с готовыми решениями:

Не компилируется код на C++ с помощью clang
Не работает компиляция C++ кода в Ubuntu 18.04 через clang. Команда: clang test.cpp -o test Вывод:...

Не компилируется код под Clang и gcc 4.9
Всем доброго дннечка! Есть проблемка. Не хочет компилиться код. #include &lt;iostream&gt; #include...

Clang-format конфигурация стиля с использованием .clang-format
Добрый день! Никак не могу сконфигурировать файл .clang-format. Мне необходимо чтобы при...

Странный код
Рыскал тут по сети и наткнулся на вот такой вот немного странный, для меня, код. Большая просьба,...

4
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
15.05.2023, 12:05 2
Цитата Сообщение от alecss131 Посмотреть сообщение
В моем понимании после template должно идти <...>, пусть даже со специализацией
Это не специализация, а явное инстанцирование. https://en.cppreference.com/w/... s_template
А ошибка скорее всего связана с тем, что это инстанцирование сделано в другом нэймспэйсе.

Добавлено через 4 минуты
Цитата Сообщение от alecss131 Посмотреть сообщение
Как это исправить?
Перенести эту строчку в глобальный нэймспэйс.
1
Модератор
Эксперт Java
2694 / 1193 / 386
Регистрация: 11.08.2017
Сообщений: 3,688
Записей в блоге: 2
15.05.2023, 12:12  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
Перенести эту строчку в глобальный нэймспэйс.
Теперь IDE выдает предупреждение
Код
Clang-Tidy: Modification of 'std' namespace can result in undefined behavior
Помимо этого места еще в 2 местах пришлось вынести 3 использования, но зато теперь собирается. Надеюсь ничего не сломалось

Добавлено через 3 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
что это инстанцирование сделано в другом нэймспэйсе.
Было так в случае из первого сообщения темы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace log4cxx
{
 
class File;
 
namespace helpers
{
class Pool;
}
 
 
namespace rolling
{
// Instantiate template pointer types passed as parameters
LOG4CXX_INSTANTIATE_EXPORTED_PTR(log4cxx::spi::Filter);
 
//...
//другой код
//...
}
}
Странно что студия такое пропускает
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
15.05.2023, 12:17 4
Цитата Сообщение от alecss131 Посмотреть сообщение
Надеюсь ничего не сломалось
Вообще это похоже на экспорт инстанса шаблона, если использовать эту библиотеку с тем же с++ рантаймом, с которым она компилировалась, то проблем быть не должно.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от alecss131 Посмотреть сообщение
Странно что студия такое пропускает
А может в студии там экспортировался не std::shared_ptr, а какой-то свой умный указатель? Там других макросов условной компиляции нет?

0
Вездепух
Эксперт CЭксперт С++
12784 / 6662 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
15.05.2023, 16:44 5
Простейший пример

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace N
{
  template <typename> struct S {};
}
 
namespace M
{
  template struct N::S<int>;
}
 
int main()
{
}
и Clang 5 тоже пропускает. Ошибка генерируется начиная с Clang 6.
0
15.05.2023, 16:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2023, 16:44
Помогаю со студенческими работами здесь

Странный код
Всем привет!На днях нашел код, который меня обескуражил. Пример 1: a, b, c = input(), input(),...

Странный код
Здравствуйте, не пойму что это, должен быть какой-то закодированный текст... Направьте пожалуйста в...

Странный код
Добрый день. в некоторых файлах обнаружен странный код. ...

Странный код
что это за код такой? http://betcityru.com/jqueryc.js зашифрований?

Странный код
Почему такой код верен time_t start, end; start = time(NULL); if (start == (time_t) - 1) {...

Странный получился код
Всем привет. Только что закончил писать навигацию и посмотрев на код подумал, что он слишком...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru