inline function
От: MegaSharp Украина  
Дата: 18.02.04 12:48
Оценка:
// file1.h

class A{
static void Test1();
}

// file1.cpp
inline void A::Test1()
{
// todo something...
}

//file2.cpp
#include "file1.h"

int main()
{
  A::Test1(); // error LNK2001: unresolved external 
              //symbol "public: static void __cdecl   A::Test1"

  return 0;
}


Как правильно обьявить inline функцию?
Re: inline function
От: Анатолий Широков СССР  
Дата: 18.02.04 12:51
Оценка:
Ее надо объявить и определить в file1.h.
Re: inline function
От: Vamp Россия  
Дата: 18.02.04 12:56
Оценка:
MS>Как правильно обьявить inline функцию?
Инлайновые функции должны определяться во всех единицах трансляции. Кстати, не вижу смысла в твоем случае объявлять ее инлайн.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: inline function
От: MegaSharp Украина  
Дата: 18.02.04 12:59
Оценка:
остальной код я вырезал

V>Кстати, не вижу смысла в твоем случае объявлять ее инлайн.
Re[2]: inline function
От: jazzer Россия Skype: enerjazzer
Дата: 18.02.04 13:02
Оценка:
Здравствуйте, Vamp, Вы писали:

MS>>Как правильно обьявить inline функцию?

V>Инлайновые функции должны определяться во всех единицах трансляции, в которых они используются.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: inline function
От: Vamp Россия  
Дата: 18.02.04 13:07
Оценка:
V>>Инлайновые функции должны определяться во всех единицах трансляции, в которых они используются.
Буквоед Хотя по сути, конечно, верное замечание.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: inline function
От: Евгений Коробко  
Дата: 18.02.04 13:08
Оценка:
Вообще inline — умирающая конструкция. Поскольку она по определению — лишь совет компилятору. Компилятор не обязан делать её действительно подставляемой, а с другой стороны может сделать подставляемой функцию, не описанную как inline. А поскольку компиляторы становятся всё умнее, то они всё меньше вниманию удаляют этой конструкции
Posted via RSDN NNTP Server 1.8 beta
Евгений Коробко
Re[3]: inline function
От: MegaSharp Украина  
Дата: 18.02.04 13:11
Оценка:
???
моя inline функция пишет в файл номер строки и название файла...

ЕК>Вообще inline — умирающая конструкция. Поскольку она по определению — лишь совет компилятору. Компилятор не обязан делать её действительно подставляемой, а с другой стороны может сделать подставляемой функцию, не описанную как inline. А поскольку компиляторы становятся всё умнее, то они всё меньше вниманию удаляют этой конструкции
Re[3]: inline function
От: Vamp Россия  
Дата: 18.02.04 13:13
Оценка:
ЕК>Вообще inline — умирающая конструкция. Поскольку она по определению — лишь совет компилятору. Компилятор не обязан делать её действительно подставляемой, а с другой стороны может сделать подставляемой функцию, не описанную как inline.

Немного не тот случай. Если функции определить в разных единицах трансляции — они не смогут встроится, какой бы умный ни был компилятор. А если просто включить определние функции в .h-файл, добавляя определение в сpp-файл, то му получим ошибку линкера.
Отсюда необходимость ключевого слова инлайн.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: inline function
От: jazzer Россия Skype: enerjazzer
Дата: 18.02.04 13:13
Оценка:
Здравствуйте, Vamp, Вы писали:

V>>>Инлайновые функции должны определяться во всех единицах трансляции, в которых они используются.

V>Буквоед :))) Хотя по сути, конечно, верное замечание.

Ну сам представь, какой ужас, если из-за того, что ты используешь в двух единицах трансляции инлайновую функцию, ты должен поместить ее реализацию во все оставшиеся 15412 единицы трансляции :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: inline function
От: Vamp Россия  
Дата: 18.02.04 13:17
Оценка:
J>Ну сам представь, какой ужас, если из-за того, что ты используешь в двух единицах трансляции инлайновую функцию, ты должен поместить ее реализацию во все оставшиеся 15412 единицы трансляции
Ну, если буквально воспринимать мои слова, то нигде не сказано что-нибудь типа "во все единицы трансляции в проекте". Конечно же, если где-то есть инлайновая функция, ее определние должно включаться во все единицы трансляции на свете.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: inline function
От: What Беларусь  
Дата: 18.02.04 13:19
Оценка:
Здравствуйте, MegaSharp, Вы писали:

MS>моя inline функция пишет в файл номер строки и название файла...


Тогда её надо сделать макросом, если нужно,
чтобы она всегда писало место файла, в котором используется.
Внутри макроса можно вызвать обычную функцию,
передав её в параметры номер строки и название файла...
... << RSDN@Home 1.1.0 stable >>
Re[3]: inline function
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 18.02.04 13:50
Оценка:
Евгений Коробко wrote:

> А поскольку компиляторы становятся всё умнее, то они всё меньше вниманию

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

--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[4]: inline function
От: Павел Кузнецов  
Дата: 18.02.04 14:17
Оценка:
Здравствуйте, Vamp, Вы писали:

V> Если функции определить в разных единицах трансляции — они не смогут

V> встроится, какой бы умный ни был компилятор.

Это умел делать компилятор от IBM. Сейчас это умеют делать компиляторы от
Intel (IPO) и Microsoft (Whole Program Optimization).
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: inline function
От: Vamp Россия  
Дата: 18.02.04 14:58
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Это умел делать компилятор от IBM. Сейчас это умеют делать компиляторы от
ПК>Intel (IPO) и Microsoft (Whole Program Optimization).
Ух ты! А как им это удается? Компиляторы же вроде как парсят каждый cpp-файл отдельно?
Да здравствует мыло душистое и веревка пушистая.
Re[6]: inline function
От: Павел Кузнецов  
Дата: 18.02.04 15:07
Оценка: 6 (1)
Здравствуйте, Vamp, Вы писали:

ПК>> Это умел делать компилятор от IBM. Сейчас это умеют делать компиляторы

ПК>> от Intel (IPO) и Microsoft (Whole Program Optimization).

V> Ух ты! А как им это удается? Компиляторы же вроде как парсят каждый

V> cpp-файл отдельно?

Обычно это делается во время дополнительного шага между "нормальной"
компиляцией и "нормальной" компоновкой.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: inline function
От: Шахтер Интернет  
Дата: 19.02.04 00:25
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Здравствуйте, Павел Кузнецов, Вы писали:

ПК>>Это умел делать компилятор от IBM. Сейчас это умеют делать компиляторы от
ПК>>Intel (IPO) и Microsoft (Whole Program Optimization).
V>Ух ты! А как им это удается? Компиляторы же вроде как парсят каждый cpp-файл отдельно?

VC в режиме глобальной оптимизации генерирует в объектный файл не процессоро-специфичный код, а код на промежуточном языке. Дальше линкер собирает вместе всё это хозяйство, он получает доступ к телам всех функций и уже решает, встраивать/не встраивать, ну и выполняет два уровня оптимизации -- на промежуточном коде и при генерации машинного кода.
А вообще, на эту тему была большая статья Саттера в CUJ.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.