Я изучаю C++ в наши дни. Вот мой вопрос: Могут ли другие люди использовать любую функцию члена класса, которую мы определили, даже если у них нет нашего файла cpp? Подробные ответы будут лучше. Благодарю.О файлах и заголовках CPP
ответ
Стандартный язык C++ ничего не говорится о том, как код или должен быть физически распределен в файлах, если, конечно, код хранится в файлах.
В частности, стандартные заголовки библиотек не обязательно являются физическими файлами, даже если большинство реализаций предоставляют эти заголовки в виде файлов.
Реализация файлов и заголовочных файлов является условным обозначением, но только для физической упаковки кода с заголовочными файлами, предназначенными для включения в директивы препроцессора #include
и файлы реализации, предназначенные для отдельной компиляции. Обычно файл реализации, такой как .cpp-файл, соответствует стандарту перевода . Но в некоторых случаях используются другие идеи упаковки физического исходного кода, например. файлы реализации, предназначенные для включения в другие файлы реализации.
Реализация функции может быть помещена в файл реализации или в файл заголовка или, например, в базе данных стандарт не волнует.Однако из-за того, как предполагается, что файлы исходного кода предназначены для использования, если реализация помещается в файл заголовка и не является шаблоном, тогда она должна быть inline
, чтобы она могла встречаться в двух или более единицах перевода, где этот заголовок Включено. Если реализация в заголовке находится непосредственно в определении класса, то это автоматически inline
, и в противном случае оно должно быть явно объявлено inline
.
Теперь, если у пользователя есть исходный код реализации, возможно, функция может быть использована.
Аналогичным образом, если пользователь имеет декларацию функции плюс подходящую скомпилированную версию, то аналогичным образом ее можно использовать.
Если у пользователя нет исходной или скомпилированной версии реализации, то его нельзя использовать.
Таким образом, это не имеет особого отношения к файлам. Но есть аспект того, можно ли распространять код без файлов реализации. И, как обсуждалось выше, да, вы можете, и это часто называют только заголовками только.
Главным образом, модули только для заголовков могут делать все, что может сделать обычный код скомпилированного кода, за одним исключением: они не могут предоставить брандмауэр компилятора ”, чтобы содержать символы, предоставленные заголовком.
И это приводит к двум основным проблемам: (1) загрязнение пространств имен и (2) невозможность предоставить (без переписывания и неудобных решений) два модуля, реализация которых зависит от деклараций друг друга.
Однако много кода распространяется как модули только для заголовков. В частности, большие части библиотеки Boost представляют собой модули только для заголовков. Основное преимущество заключается в том, что для использования этих частей нет сложностей в построении библиотеки или установке отдельно скомпилированного кода, созданного с использованием разных опций и т. Д.
Если реализация этих функций находится внутри файла CPP, они не могут. Если заголовочный файл .h или .hpp содержит определение и реализацию, то да, они могут.
Могут ли другие люди использовать любую функцию члена класса, которую мы определили, даже если у них нет нашего файла cpp?
Да, пока вы доставляете библиотеку, содержащую скомпилированный .cpp
файл, и он подходит для их компилятором ABI, они будут иметь возможность использовать свой код, даже без необходимости компилировать .cpp
сами файлы.
Чтобы использовать функцию, функция должна быть объявлена и должна быть (конечно) реализована где-то, а для использования функции-члена класса функция должна быть общедоступной, а не частной.
Теперь другие люди (и вы) не могут использовать ваши функции, если у них нет реализаций где-то, и в вашем случае, если они не имеют .cpp-файла, который содержит реализации. Поэтому реальная проблема заключается не в .cpp но там, где вы внедрили свои функции.
Действительно, если вы хотите поделиться своими функциями с кем-то, вы должны поделиться им как с библиотекой, которая содержит фактические реализации, и с файлом заголовка, который предоставляет интерфейс для этой библиотеки, таким образом, пользователь не сможет получить доступ исходный код ваших функций.
Да, они могут, если вы создадите библиотеку и распределите ее с помощью своих заголовков. Затем люди могут ссылаться на вашу библиотеку, чтобы использовать функции и классы, объявленные в ваших файлах заголовков. Библиотека будет содержать код из ваших файлов cpp в двоичном формате, а заголовки будут направлять компиляторы пользователей о том, как вызывать код в библиотеке.
Вот документация для Windows, и учебник для Linux:
https://msdn.microsoft.com/en-us/library/ms235636.aspx
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
- 1. forward декларация в двух заголовках и двух файлах cpp
- 2. Как я могу использовать вектор в нескольких файлах .cpp и заголовках одновременно?
- 3. Встроенные функции в cpp-файлах разделяемых библиотек
- 4. О заголовках tar
- 5. Способы размещения в файлах .h и .cpp
- 6. #ifdefs в .cpp и .h файлах
- 7. О заголовках, форвардах и о том, как организовать множество включений
- 8. О статическом элементе cpp
- 9. включая заголовочные файлы в .cpp-файлах
- 10. Повышение Сериализации - Экспорт в нескольких файлах CPP
- 11. XCode не ломается в # include'd CPP-файлах
- 12. Инициализация виртуальных функций в .cpp-файлах
- 13. Использование переменной в нескольких файлах Cpp
- 14. C++ Вызывающие функции в нескольких файлах .cpp?
- 15. Требуется ли __declspec (dllexport) в файлах cpp
- 16. CMake с информацией о сгенерированных файлах
- 17. Как программно получить информацию о заголовках CellTable?
- 18. CRTP, форвардные декларации и шаблоны в файлах cpp
- 19. Создание файла класса C++ в файлах .h и .cpp
- 20. C++ Создание класса в отдельных файлах .cpp и .h
- 21. о zipping файлах кеша
- 22. Вопрос о файлах Sitemap
- 23. Вопрос о предварительно скомпилированных заголовках в Visual C++
- 24. О файлах .h и .m (как управлять)
- 25. Подтверждение о пакетных файлах и кодах
- 26. Вопрос RFC о файлах cookie и путях
- 27. объявляет одно и то же пространство имен в двух разных заголовках, а затем включает их в один cpp
- 28. CPP - Включая файлы .h и .cpp файлы в .cpp-файл
- 29. Как сделать массив символов доступным в нескольких файлах .cpp?
- 30. Получение информации о загруженных файлах
Вы спрашиваете, если все, что у них есть, это заголовочный файл, они могут по-прежнему использовать класс если реализация находится в отдельном файле cpp? – NathanOliver