LINUX.ORG.RU

Функция-шаблон С++ в статической библиотеке?

 ,


0

3

Пишу под Debian, набросал библиотечку с набором функций. По ходу дела понадобилось в некоторых функциях работать с различными типами данных, описал как шаблоны. Теперь undefined reference при сборке проекта, который эту библиотеку подключает и вызывает функции-шаблоны. Можно ли это обойти? Или шаблоны только в рамках одного проекта могут быть используемы?


Ответ на: комментарий от Miguel

Взаимоисключающие параграфы такие взаимоисключающие...

Отнюдь. Реальные макры всегда работают на уровне AST. Поэтому и код, который генерят реальные макры позволяет расширять синтаксис языка. Потому то макры в це - жалкое подобие. Ими не расширить синтаксис. Ими можно только накостылить тупую замену текста. А уж шаблонами цепепе даже такого не сделать, потому что с их помощью уже сам компилятор генерит типы и функции - т.е. шаблоны в крестах - это частный случай макр в Си.

azelipupenko
()
Ответ на: комментарий от Miguel

Его даже сдампить можно, в некоторых реализациях. См. выше.

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

azelipupenko
()
Ответ на: комментарий от azelipupenko

т.е. шаблоны в крестах - это частный случай макр в Си.

Я не понял, ты решил для разнообразия меня поддержать?

Miguel ★★★★★
()
Ответ на: комментарий от azelipupenko

Толку то от этого?

Ну, строго говоря, толку от C++ вообще никакого, но мы не об этом.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Я не понял, ты решил для разнообразия меня поддержать?

Ты читал «Дизайн и эволюция Си++»? Видел первые попытки сделать контейнеры? Там во все поля использовались обычные макросы. Это уже потом на основе этих наработок Страуструп изобрёл частный случай макр под названием «шаблоны». И даже не частный случай макр си, а замену им. Он решил, что этого хватит, ибо привносит типобезопасность.

azelipupenko
()
Ответ на: комментарий от Miguel

Ещё раз: ты решил меня поддержать?

Я не знаю о чём ты :-) Я всего лишь высказываю то, что знаю. Я знаю, что макры и шаблоны - суть принципиально разные по замыслу технологии. Макросы принимают на вход код и раскрываются в другой произвольный код на целевом языке. Шаблоны принимают на вход типы и константы и инстанцируются в классы и функции. Смешивать эти понятия глупо. Поэтому Страуструп специально отошёл от терминологии макросов и ввёл само понятие «шаблон».

azelipupenko
()
Ответ на: комментарий от azelipupenko

Результат работы макроса - это код на целевом языке
частный случай макр под названием «шаблоны»

Но шаблоны не генерируют кода на целевом языке(и текста там тоже никакого)

Deleted
()
Ответ на: комментарий от azelipupenko

частный случай макр под названием «шаблоны»

макры и шаблоны - суть принципиально разные по замыслу технологии.

Аспирин у кого-нибудь есть?

Miguel ★★★★★
()
Последнее исправление: Miguel (всего исправлений: 1)
Ответ на: комментарий от azelipupenko

частный случай макр под названием «шаблоны»

Тебе взаимоисключающие параграфы в голове не жмут? Ты вроде в этом треде утверждал обратное?

i-rinat ★★★★★
()
Ответ на: комментарий от tailgunner

if(0), и компилятор выбросит код

С каких пор это гарантируется?

C++17: http://en.cppreference.com/w/cpp/language/if

А неофициально, то любой уважающий себя компилятор делает constant propagation (но, думаю, я зря упоминаю)

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от Deleted

Но шаблоны не генерируют кода на целевом языке(и текста там тоже никакого)

Это мы все знаем. Частный случай тут в том, что текстом шаблона может выступать только текст определения класса или функции. Текст макроса может быть абсолютно любым.

azelipupenko
()
Ответ на: комментарий от Deleted

Но шаблоны не генерируют кода на целевом языке(и текста там тоже никакого)

Ты вроде пару страниц пытался доказать, что генерят, нет?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Тебе взаимоисключающие параграфы в голове не жмут? Ты вроде в этом треде утверждал обратное?

Конкретно тебе я утверждал и утверждаю, что шаблоны - это никакие не «макросы с гигиеной».

azelipupenko
()
Ответ на: комментарий от KennyMinigun

if(0), и компилятор выбросит код

С каких пор это гарантируется?

C++17

То есть до сих пор не гарантируется.

любой уважающий себя компилятор делает constant propagation

Начиная с некоторого уровня оптимизации.

tailgunner ★★★★★
()
Ответ на: комментарий от i-rinat

Я топил за некоторую схожесть макросов и шаблонов. А вот это

Результат работы макроса - это код на целевом языке

в ответ прилетело, и я с этим не согласен. Выше более ясно изложили

Deleted
()
Ответ на: комментарий от azelipupenko

И получается тот самый частный случай. А вот когда ты вот такое говоришь:

макры и шаблоны - суть принципиально разные по замыслу технологии

становиться непонятно

Deleted
()
Ответ на: комментарий от azelipupenko

Конкретно тебе я утверждал и утверждаю

А, то есть сквозная взаимная непротиворечивость суждений не обязательна?

i-rinat ★★★★★
()
Ответ на: комментарий от tailgunner

То есть до сих пор не гарантируется.

Если дотошно, if (0) — то нет. Но ведь можно гарантировать используя if constexpr (0).

KennyMinigun ★★★★★
()
Ответ на: комментарий от Deleted

становиться непонятно

У Страуструпа не было замысла сделать в Си++ расширяемый синтаксис. Поэтому он ограничился фреймворков для генерации типов и функций. Назвал эту технологию шаблонами и успокоился.

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

azelipupenko
()
Ответ на: комментарий от azelipupenko

У Страуструпа не было замысла сделать в Си++ расширяемый синтаксис.

Кстати, коммитет работает над концептами. https://youtu.be/4AfRAVcThyA

KennyMinigun ★★★★★
()
Ответ на: комментарий от azelipupenko

С этим я не спорю, я имел ввиду следующие твои фразы:

частный случай макр под названием «шаблоны»

макры и шаблоны - суть принципиально разные по замыслу технологии

Одно с другим не вяжется же

Deleted
()
Ответ на: комментарий от Deleted

макры и шаблоны - суть принципиально разные по замыслу технологии

Очевидно :-) Самый замысел шаблонов - избавиться от макросов Си :-) Предоставить типобезопасную альтернативу. Это всё пошло от необходимости в контейнерах.

А замысел макросов - универсальное средство генерации кода на целевом языке.

Одно с другим не вяжется же

Ну ты постарайся :-)

azelipupenko
()
Ответ на: комментарий от azelipupenko

Ну ты постарайся :-)

Вот теперь уже мне слив засчитайте

Deleted
()
Ответ на: комментарий от i-rinat

Заявлял ли ты, что шаблоны являются частным случаем макросов Си?

Так и есть. Они самим своим появлением обязаны макрам Си.

azelipupenko
()
Ответ на: комментарий от tailgunner

любой уважающий себя компилятор делает constant propagation

Начиная с некоторого уровня оптимизации.

Кстати, в рамках интереса проверил c -O0*:

* впрочем -O0 — тоже «некоторый уровень оптимизации».

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Там если -fno-dce и -fno-tree-dce указать, всё равно «оптимизирует». Похоже, это поведение в GCC никак не выключить.

i-rinat ★★★★★
()
Ответ на: комментарий от tailgunner

Это было очевидно.

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

i-rinat ★★★★★
()
Ответ на: комментарий от tailgunner

Как меня умиляют персонажи, у которых «GCC» - это «GCC последней версии на AMD64».

Меня тоже, но в сабже — AMD64 не релевантно*, а GCC 4.1.2 и Clang 3.0 ведут себя ровно так же.

* Если попросишь вежливо, проверю и на ARM :)

KennyMinigun ★★★★★
()
Ответ на: комментарий от anonymous

ага, я тоже поржал:

        mov       eax, 0                                        #2.3
        test      eax, eax                                      #2.3
        je        ..B1.3        # Prob 100%  

        ; ...

..B1.3:                         # Preds ..B1.1
        mov       eax, 13                                       #5.14
        leave                                                   #5.14
        ret                                                     #5.14

Вестимо icc не входит в категорию «уважающий себя компилятор» под моими критериями :)

KennyMinigun ★★★★★
()
Ответ на: комментарий от tailgunner

А на PowerPC? На Microblaze? А другие версии компиляторов?

Проверяй хоть все, что есть на godbolt.org ;) Что-то мне подсказывает, что такая оптимизация происходит перед этапом платформозависимой кодогенерации.

А не-GCC?

/me считает компиляторы кроме gcc и clang (и их производные) не кошерными (в частности icc).

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

А на PowerPC? На Microblaze? А другие версии компиляторов?

Проверяй

okay.jpg

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.