Если писать енти функции при определении класса то все понятно, но тут понадобилось написать такие функции за определением (не в нем). Я всегда счетал, что все как с обычными, но надо только inline добавить, но при компиляции написало LNK2019 unresolved external symbol.......
Полез я в документацию, там вроде много чего говорится. Там говорится о "one definition" rule.
Скажите, inline функцию надо определять в том же *.h файле ????????? Я просто думал, что можно и в cpp ???????????????
Здравствуйте, Stas Chistyakov, Вы писали:
SC>Скажите, inline функцию надо определять в том же *.h файле ????????? Я просто думал, что можно и в cpp ???????????????
Вообще-то, их обычно пишут в том же .h, где объявлен класс, поскольку для того, чтобы код функции был подставлен в место вызова, компилятор должен знать ее реализацию.
Здравствуйте, Stas Chistyakov, Вы писали:
SC>Если писать енти функции при определении класса то все понятно, но тут понадобилось написать такие функции за определением (не в нем). Я всегда счетал, что все как с обычными, но надо только inline добавить, но при компиляции написало LNK2019 unresolved external symbol.......
SC>Полез я в документацию, там вроде много чего говорится. Там говорится о "one definition" rule. SC>Скажите, inline функцию надо определять в том же *.h файле ????????? Я просто думал, что можно и в cpp ???????????????
Здравствуйте, Stas Chistyakov, Вы писали:
SC>Полез я в документацию, там вроде много чего говорится. Там говорится о "one definition" rule. SC>Скажите, inline функцию надо определять в том же *.h файле ????????? Я просто думал, что можно и в cpp ???????????????
Проблема вот в чем: при раздельной компиляции твоих .cpp файлов вместо каждого вызова inline-функции компилятор должен подставить ее тело, а для этого он должен его иметь — соответственно если inline-функция объявлена в .cpp, то компилятор ее не увидит, а линкер просто не умеет опять вызывать компилятор для разрешения таких ситуаций.
В стандарте все это выражено через два типа связывания символов: internal и external.
Ага, спасибо. Я нашел выссказываение про раздельную компиляцию h и cpp, но просто думал, что можно как-нибудь ключами компилятора или еще какой хреньью на это повлиять. Спасибо.
Здравствуйте, Stas Chistyakov, Вы писали:
SC>Ага, спасибо. Я нашел выссказываение про раздельную компиляцию h и cpp, но просто думал, что можно как-нибудь ключами компилятора или еще какой хреньью на это повлиять. Спасибо.
Нет, не .h и .cpp компилируются раздельно — ситуация совсем другая. В каждый .cpp включаются все файлы, упомянутые в #include — результат является одной единицей трансляции. Каждая единица компилируется раздельно — так что если inline-функция не была определена в одном из включенных файлов, то она будет недоступна компилятору во время компиляции этой единицы трансляции.