2016-06-10 3 views
-3

Я занимаюсь avr, и у меня возникает вопрос, когда вы создаете библиотеку, которая лучше сделать заголовочный файл, содержащий декларации функций и файл ac, которые содержат код (определения функций), или просто сделать только заголовочный файл, который содержит оба заявление и определение функцийсоздание библиотек

+1

Не помещайте функции в файлы заголовков. Их почему-то называют __header files__. –

+1

Ваш вопрос делает фундаментальную ошибку. Он предполагает, что между этими двумя подходами нет никакой разницы. Это неправда. Есть серьезные последствия, кодовые, и вам нужно их полностью понять, чтобы принять разумное решение. –

+1

В любом случае ваши предложения связаны с созданием * библиотеки *. Это просто вопрос отдельной компиляции и связывания с одной единицей перевода. Почему помечены вложенные? Вопрос полностью общий. – Clifford

ответ

1

этих два варианта, применимых в различных ситуациях:

  • Если вы пишете библиотеку шаблонов в C++, заголовок только вариант хорош, потому что ваши библиотека не имеет компонента link-time. Вот как распределяется значительная часть стандартной библиотеки C++ (ранее известной как STL).
  • Если вы пишете библиотеку C-стиля или библиотеку классов C++, только заголовок не является вариантом. Вы должны отделить заголовок от реализации, скомпилировать реализацию в связующую библиотеку и распространить заголовок, который идет с ним. В противном случае, в том числе один и тот же заголовок с определениями в нескольких единицах перевода, приведет к ошибкам времени связывания из-за дублирования определений.
0

Файл заголовка включает только прототип, являющийся декларацией определения, включая как переменную, так и функцию. Он может быть включен многими другими файлами.

Определение функции - это реализация, и она должна быть только одной.

Если вы поместите определение функции в файл заголовка и включаете несколько файлов C, во время фазы компилятора будет возникать ошибка определения, особенно во время ссылки для нескольких объектов (включая это определение функции) в один конечный объект.

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

Смежные вопросы