2016-03-23 5 views
0

Я изучаю C++ в наши дни. Вот мой вопрос: Могут ли другие люди использовать любую функцию члена класса, которую мы определили, даже если у них нет нашего файла cpp? Подробные ответы будут лучше. Благодарю.О файлах и заголовках CPP

+1

Вы спрашиваете, если все, что у них есть, это заголовочный файл, они могут по-прежнему использовать класс если реализация находится в отдельном файле cpp? – NathanOliver

ответ

1

Стандартный язык C++ ничего не говорится о том, как код или должен быть физически распределен в файлах, если, конечно, код хранится в файлах.

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

Реализация файлов и заголовочных файлов является условным обозначением, но только для физической упаковки кода с заголовочными файлами, предназначенными для включения в директивы препроцессора #include и файлы реализации, предназначенные для отдельной компиляции. Обычно файл реализации, такой как .cpp-файл, соответствует стандарту перевода . Но в некоторых случаях используются другие идеи упаковки физического исходного кода, например. файлы реализации, предназначенные для включения в другие файлы реализации.

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

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

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

Если у пользователя нет исходной или скомпилированной версии реализации, то его нельзя использовать.

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

Главным образом, модули только для заголовков могут делать все, что может сделать обычный код скомпилированного кода, за одним исключением: они не могут предоставить брандмауэр компилятора ”, чтобы содержать символы, предоставленные заголовком.

И это приводит к двум основным проблемам: (1) загрязнение пространств имен и (2) невозможность предоставить (без переписывания и неудобных решений) два модуля, реализация которых зависит от деклараций друг друга.

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

0

Если реализация этих функций находится внутри файла CPP, они не могут. Если заголовочный файл .h или .hpp содержит определение и реализацию, то да, они могут.

0

Могут ли другие люди использовать любую функцию члена класса, которую мы определили, даже если у них нет нашего файла cpp?

Да, пока вы доставляете библиотеку, содержащую скомпилированный .cpp файл, и он подходит для их компилятором ABI, они будут иметь возможность использовать свой код, даже без необходимости компилировать .cpp сами файлы.

0

Чтобы использовать функцию, функция должна быть объявлена ​​и должна быть (конечно) реализована где-то, а для использования функции-члена класса функция должна быть общедоступной, а не частной.

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

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

0

Да, они могут, если вы создадите библиотеку и распределите ее с помощью своих заголовков. Затем люди могут ссылаться на вашу библиотеку, чтобы использовать функции и классы, объявленные в ваших файлах заголовков. Библиотека будет содержать код из ваших файлов cpp в двоичном формате, а заголовки будут направлять компиляторы пользователей о том, как вызывать код в библиотеке.

Вот документация для Windows, и учебник для Linux:
https://msdn.microsoft.com/en-us/library/ms235636.aspx
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

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