Что такое исходный файл
tl; dr: как связаны исходные и заголовочные файлы в C ? Проекты сортируют зависимости объявления/определения неявно во время сборки?
Я пытаюсь понять, как компилятор понимает отношения между .c и .h файлы.
учитывая эти файлы:
источник.c:
main.c:
этот бардак компиляции? В настоящее время я делаю свою работу в NetBeans 7.0 С gcc от Cygwin, который автоматизирует большую часть задачи сборки. Когда проект скомпилирован, файлы проекта будут сортировать это неявное включение source.c на основе деклараций в header.h ?
преобразование файлов исходного кода C в исполняемую программу обычно выполняется в два этапа:сборка и связь.
во-первых, компилятор преобразует исходный код в объектные файлы ( *.o ). Затем компоновщик берет эти объектные файлы вместе со статически связанными библиотеками и создает исполняемую программу.
в каждом блоке компиляции все используемые функции должны быть объявил, чтобы компилятор знал, что функция существует и каковы его аргументы. В вашем примере, объявление функции returnSeven в заголовочном файле header.h . При компиляции main.c , вы включаете заголовок с объявлением, чтобы компилятор знает, что returnSeven существует при компиляции main.c .
когда компоновщик выполняет свою работу, ему нужно найти определение каждой функции. Каждая функция должна быть определена ровно один раз в одном из объектных файлов - если существует несколько объектных файлов, содержащих определение одной и той же функции, компоновщик остановится с ошибкой.
функции returnSeven определена в source.c (и main функция определена в main.c ).
Итак, подводя итог, у вас есть две единицы компиляции: source.c и main.c (с файлами заголовков, которые он включает). Вы компилируете их в два объектных файла: source.o и main.o . Первый будет содержать определение returnSeven , второе определение main . Затем компоновщик склеит эти два вместе в исполняемую программу.
здесь внешняя связь и внутренние связь. По умолчанию функции имеют внешнюю связь, что означает, что компилятор делает эти функции видимыми для компоновщика. Если вы делаете функцию static , он имеет внутреннюю связь - он виден только внутри блока компиляции, в котором он определен (компоновщик не будет знать, что он существует). Это может быть полезно для функций, которые делают что-то внутренне в исходном файле и что нужно скрывать от остальной части программы.
ваш пример должны compile (несмотря на глупые синтаксические ошибки). Например, используя GCC, вы можете сначала сделать:
этой ссылки две объектные файлы в исполняемый двоичный файл, и выполняет разрешение символов. В нашем примере, это возможно, потому что main.o требует returnSeven() , и это подвергается source.o . В случаях, когда все не совпадает, ошибка компоновщика приведет к.
в компиляции нет ничего волшебного. И не автоматически!
заголовочные файлы, в основном, предоставляют информацию для компилятора, почти никогда не код.
Одной этой информации обычно недостаточно для создания полной программы.
рассмотрим программу "hello world" (с более простым
заголовочные файлы используются для разделения объявлений интерфейса, соответствующих реализациям в исходных файлах. Они подвергаются насилию другими способами, но это обычный случай. Это не для компилятора, это для людей, пишущих код.
большинство компиляторов фактически не видят два файла отдельно, они объединяются препроцессором.
сам компилятор не имеет конкретных "знаний" о взаимоотношениях между исходными файлами и файлами заголовков. Эти типы отношений обычно определяются файлами проекта (например, makefile, solution и т. д.).).
данный пример выглядит так, как будто он будет компилироваться правильно. Вам нужно будет скомпилировать оба исходных файла, а затем компоновщику понадобятся оба объектных файла для создания исполняемого файла.
Если вышеприведенные рассуждения выглядят скучными и непонятными, не огорчайтесь. Дело в том, что процесс перевода удалось переложить на сам компьютер! "Умные" программы, называемые компиляторами, выполняют весь объем работы, связанный с этим переводом. Детали процесса зависят от особенностей конкретной системы. Ниже кратко описано несколько способов перевода.
Файлы
Файлы По многочисленным просьбам открываем раздел с полезными файлами для W2k. Раздел состоит из двух частей, первая официальные патчи от Microsoft (не все, а только те, что кажутся нам наиболее важными), и вторая часть, куда войдут все файлы упоминавшиеся в FAQ, просто утилитки,
Приложение 3 Исходные тексты калькулятора hoc
Приложение 3 Исходные тексты калькулятора hoc These files contain all the code from "The Unix Programming Environment", by Brian Kernighan and Rob Pike (Prentice Hall, 1984, ISBN 0-13-937681-X). A separate hoc6 distribution contains any fixes that we have applied to that; the version in this file is from the book.Copyright © Lucent Technologies, 1997. All Rights ReservedPermission to use, copy, modify, and distribute this software and its documentation for
А.3.5. Исходные тексты программы-калькулятора
А.3.5. Исходные тексты программы-калькулятора В листинге А.3 показан текст программы, вычисляющей значения постфиксных выражений.Листинг А.3. (calculator.c) Основная часть программы-калькулятора/* Вычисления в унарном формате. *//* На вход программы подаются однострочные
12. Комментарии. Исходные файлы
12. Комментарии. Исходные файлы Комментарием является набор символов, игнорируемых компилятором. Но на данный набор символов накладываются определенные ограничения. Внутри набора символов, представляющих комментарий, не может быть специальных символов, которые
SCF-файлы
SCF-файлы Файлы с таким расширением являются командными файлами оболочки Windows и используются для различных целей. Например, можно создать файл, который будет сворачивать все окна. Его содержимое приведено в листинге 17.3. Если ввести подобный текст в текстовый файл, а потом
INF-файлы
INF-файлы В данной статье мы рассмотрим, что представляет собой INF-файл, как с его помощью работать с другими файлами и реестром, создавать ярлыки, запускать программы и т.д.Как известно, для более-менее серьезного программного продукта обычно требуется специальная
Исходные файлы
Исходные файлы Текст программы на языке Си может быть разделен на несколько исходных файлов. Исходный файл представляет собой текстовый файл, который содержит либо всю программу, либо ее часть. При компиляции исходной программы каждый из составляющих ее исходных файлов
для целей этого вопроса меня интересует только стандартно-совместимый C++, а не C или C++0x, а не какие-либо конкретные детали реализации.
Файлы gbak
Файлы gbak Утилита gbak анализирует и разбивает на части файлы Firebird, сохраняя отдельно метаданные и данные в компактном формате. Копия, сделанная gbak, не является файлом базы данных и не будет распознаваться сервером. Чтобы стать используемой, она должна быть восстановлена в
Файлы
Файлы По многочисленным просьбам открываем раздел с полезными файлами для W2k. Раздел состоит из двух частей, первая официальные патчи от Microsoft (не все, а только те, что кажутся нам наиболее важными), и вторая часть, куда войдут все файлы упоминавшиеся в FAQ, просто утилитки,
Сжатые файлы
Сжатые файлы Если комплект поставки для Windows содержит ZIP-файлы, вам нужно иметь утилиты (например, WinZip, PKZip или WinRAR) для просмотра содержимого и/или распаковки файлов перед инсталляцией. Такой комплект поставки (не для начинающих) содержит следующее:* версия 1.5 ZIP полной
16.2 включение исходного файла [cpp.включить]
(акцент в цитате выше-мой.) Значение этого различия похоже, что стандарт намерен различать "заголовок" и "исходный файл", но нигде документ не определяет ни один из этих терминов, ни разницу между ними.
есть несколько других мест, где заголовки и исходные файлы можно даже не упоминать. Несколько:
158) заголовок не обязательно является исходным файлом, и последовательности, разделенные именами заголовков, не обязательно являются допустимыми именами исходных файлов (16.2).
кажется, что заголовок может не находится в файловой системе,но он не говорит, что исходные файлы тоже.
12. Комментарии. Исходные файлы
12. Комментарии. Исходные файлы Комментарием является набор символов, игнорируемых компилятором. Но на данный набор символов накладываются определенные ограничения. Внутри набора символов, представляющих комментарий, не может быть специальных символов, которые
INF-файлы
INF-файлы В данной статье мы рассмотрим, что представляет собой INF-файл, как с его помощью работать с другими файлами и реестром, создавать ярлыки, запускать программы и т.д.Как известно, для более-менее серьезного программного продукта обычно требуется специальная
CPL-файлы
CPL-файлы Из нескольких предыдущих абзацев вы узнали практически все теоретические выкладки, которые необходимы для работы с программой rundll32.exe. Сейчас же будут перечислены те возможности, которые данная программа может предоставить пользователю. Начнем с описания
Глава 26. Файлы
Глава 26. Файлы сценарии начальной загрузкиЭти файлы содержат объявления псевдонимов и переменных окружения, которые становятся доступны Bash после загрузки и инициализации системы./etc/profileНастройки системы по-умолчанию, главным образом настраивается окружение командной
DBX-файлы
2 лексические конвенции [lex]
это самое близкое, что я мог найти к определению, и это, похоже, означает, что заголовки не являются "текстом программы".- Но если ты. --7--> заголовок, разве он не становится частью текста программы? Это немного вводит в заблуждение.
так что же такое заголовок? Что такое исходный файл?
разве это не говорит о том, что заголовок может быть реализован как исходный файл, но снова может не быть? что касается" Что такое исходный файл", кажется очень разумным, чтобы стандарт не разъяснял это, учитывая множество способов реализации" файлов".
стандартные заголовки (string, iostream) не обязательно должны быть файлами с этими именами или даже файлами вообще. До тех пор, пока вы говорите
определенный список деклараций входит в область применения, стандарт удовлетворен. Именно то, как это происходит, является деталью реализации. (когда стандарт был написан, DOS могла обрабатывать только имена файлов 8.3, но некоторые из стандартных имен заголовков были длиннее)
Как говорят ваши цитаты: заголовок-это то, что включено с помощью <> , а исходный файл-это компилируемый файл или что-то включенное с помощью "" . Именно то, откуда они берутся, и какие нестандартные заголовки доступны, зависит от реализации. Все стандартные указывает то, что определено, если вы включаете стандартные заголовки.
по соглашению заголовки обычно являются общесистемными вещами, а исходные файлы обычно локальны для проекта (для некоторое определение проекта), но стандарт мудро не увязает ни в чем, связанном с организацией проекта; он просто дает очень общие определения, совместимые с такими соглашениями, оставляя детали реализации и/или пользователю.
почти все стандартные сделки с программой после ее предварительной обработки, в это время нет таких вещей, как исходные файлы или заголовки, только единицы перевода, которые определяет ваша последняя цитата.
мое случайное понимание заключалось в том, что различие между includes и "" includes было унаследовано от c и (хотя и не определено стандартами)де-факто значение было то, что искал пути для системы и компилятора при условии заголовков И "" также искал локальные и пользовательские пути.
приведенное выше определение, похоже, в некотором смысле согласуется с этим использованием, но ограничивает использование "заголовка" вещами, предоставляемыми компилятором или система эксклюзивные кода, предоставленного пользователем, даже если они имеют традиционный "интерфейс идет в форме заголовка".
Я не совсем понимаю, как вещи должны быть разделены на источник C и заголовочные файлы. Я часто вижу много проектов с двумя наборами файлов с одинаковым именем (без расширения, обозначающего исходные и заголовочные файлы).
до сих пор, из-за этого отсутствия понимания, когда я писал библиотеки, я бросил весь код класса и метода класса в один файл, с нерешительностью относительно выбора расширения файла.
Что должно быть в заголовках и что должно быть в исходные файлы? Как реализовать это разделение?
нет технические разницы. Компилятор с радостью позволит вам включить .c файл или скомпилировать .h файл напрямую, если вы хотите.
есть, однако, огромный культуры отличия:
декларации (прототипы) поехать в .h файлы. The это интерфейс к тому, что реализовано в соответствующем .c файл.
определения поехать в .c файлы. Они!--24-->реализовать интерфейс, указанный в .
если функция определена в , а ты не хотите использовать его с другими .c files, нет необходимости объявлять его в заголовке. Это, по сути, деталь реализации этого . В этом случае сделайте функцию static также, поэтому он не конфликтует с идентично названными функциями в других файлах.
что должно быть в заголовках и что должно быть в исходных файлах?
обычно заголовки содержат одно или несколько из следующих:
- объявление функции (кроме статики)
- переменной (обычно глобальной)
- объявление определенного пользователем типа (читать struct , union etc.)
- определение макроса
исходные файлы с другой стороны есть:
- определение функции / переменной
- объявление и определение статической функции (вы не хотите подвергать их воздействию ваших клиентов)
- переменной определение
- некоторые предпочитают определять встроенные функции (C99) в заголовке
как реализовать это разделение?
одно правило определения - ваш друг.
помните, если вы пишете библиотеку, это то, что видит ваш клиент. Итак, будьте полезны и предоставьте всю информацию, которую вы можете для них использовать в своей библиотеке. Исходные файлы обычно компилируются и поставляются в двоичной форме.
и, кстати, C не имеет понятия классов.
обычно заголовочные файлы содержат объявления, исходные файлы содержат код.
Так, если в исходном файле A.c вам нужна функция, реализованная в исходном файле B.c , вы просто включаете B.h чтобы иметь его объявление.
между ними мало принципиальной разницы .с и. H файлы (хотя некоторые компиляторы могут отказаться от компиляции raw .H-файл). Разница скорее условная.
обычно .H файл предоставляет API и .c обеспечивает осуществление.
соответственно .H файл будет содержать только то ,что необходимо другим исходным файлам для доступа к средствам, предоставляемым вашим.файл c. Так что .H файлы будут предоставлять прототипы функций глобальных функций, объявления глобальных переменных (если они действительно нужны), а также используемые ими структуры и другие типы. (Не выставляйте структуру, если API требует только указатель на структуру.)
встроенные функции также часто включаются .H файлы, но некоторые рекомендации по кодированию предпочитают использовать отдельное расширение (например .inl)
все другие реализации функций, определение и инициализация переменных и объявления локальных (статических) переменных и функции будут в том .файл c.
Файлы
Файлы Файлы – одно из фундаментальных понятий в компьютерной технологии и программировании. Но поскольку данная книга рассчитана на пользователей компьютера, я не буду давать точного определения файла, дабы не запутать вас и не запутаться самому.Если после прочтения
Программа на C++ чаще всего включает в себя большое число исходных файлов, в каждом из которых находятся описания типов, функций, переменных и констант. Чтобы имя можно было применять в разных исходных файлах для ссылки на определенный объект, оно должно быть описано как внешнее. К примеру:
extern double sqrt(double); extern instream cin;
Самый простой способ обеспечить согласованность исходных файлов – помещение таких же описаний в отдельные файлы, которые называются заголовочными (или хэдер) файлами, после чего включить, т. е. скопировать, эти заголовочные файлы во все файлы, где необходимы эти описания. К примеру, если описание sqrt располагается в заголовочном файле для стандартных математических функций math.h и необходимо извлечь квадратный корень из 4, следует применить программу:
Так как обычные заголовочные файлы состоят из большого числа исходных файлов, в них нет описаний, которые не должны повторяться.
В команде включения include имя файла, которое располагается в угловых скобках, например, относится к файлу с таким именем в стандартном каталоге (обычно это /usr/include/CC); на файлы, хранящиеся в других местах, ссылаются, применяя имена, расположенные в двойных кавычках. Например:
включит math1.h из текущего пользовательского каталога, а math2.h из каталога /usr/bs.
Покажем, как мы могли бы определить тип потока вывода ostream. Для упрощения задачи предположим, что для буферизации определен тип streambuf. Тип streambuf определен в том месте, где также располагается и настоящее определение ostream. Значение типа, определяемого пользователем, специфицирует данные, которые нужны для представления объекта этого типа, и большое число операций для работы с этими объектами. Определение состоит из двух частей: закрытой (private) части, в которой находится информация, используемая только его разработчиком, и открытой (public) части, являющейся интерфейсом типа с пользователем.
Данный текст является ознакомительным фрагментом.
Продолжение на ЛитРес
Исходные файлы
Исходные файлы Текст программы на языке Си может быть разделен на несколько исходных файлов. Исходный файл представляет собой текстовый файл, который содержит либо всю программу, либо ее часть. При компиляции исходной программы каждый из составляющих ее исходных файлов
1.5.4. Исходные тексты
1.5.4. Исходные тексты Linux — система с открытым кодом, не так ли? Верховным судьей, определяющим, как работает система, является исходный код самой системы. К нашему счастью, он доступен бесплатно. В имеющийся дистрибутив Linux могут входить исходные тексты всей системы и всех
27. Исходные файлы С++
27. Исходные файлы С++ Программа на C++ чаще всего включает в себя большое число исходных файлов, в каждом из которых находятся описания типов, функций, переменных и констант. Чтобы имя можно было применять в разных исходных файлах для ссылки на определенный объект, оно
4.3. Файлы
4.3. Файлы В завершение главы рассмотрим три несложных примера работы с файлами: копирование файла (с отображением хода копирования в ProgressBar), определение значков, ассоциированных с файлами, и извлечение значков из ЕХЕ– и DLL-файлов.Красивое копирование файлаКазалось бы,
5.11.2. Файлы устройств
5.11.2. Файлы устройств Отдельного разговора заслуживают файлы устройств. Для Linux нет разницы между устройством и файлом. Все устройства системы представлены в корневой файловой системе в виде обычных файлов. Как уже упоминалось, файлы устройств хранятся в каталоге /dev.
Приложение Г Различные исходные коды
Приложение Г Различные исходные коды Г.1. Заголовочный файл unp.h Почти каждая программа в этой книге начинается с подключения заголовочного файла unp.h, показанного в листинге Г.1[1]. Этот файл подключает все стандартные системные заголовочные файлы, необходимые для работы
CPL-файлы
CPL-файлы Из нескольких предыдущих абзацев вы узнали практически все теоретические выкладки, которые необходимы для работы с программой rundll32.exe. Сейчас же будут перечислены те возможности, которые данная программа может предоставить пользователю. Начнем с описания
27. Исходные файлы С++
27. Исходные файлы С++ Программа на C++ чаще всего включает в себя большое число исходных файлов, в каждом из которых находятся описания типов, функций, переменных и констант. Чтобы имя можно было применять в разных исходных файлах для ссылки на определенный объект, оно
Файлы
Файлы По многочисленным просьбам открываем раздел с полезными файлами для W2k. Раздел состоит из двух частей, первая официальные патчи от Microsoft (не все, а только те, что кажутся нам наиболее важными), и вторая часть, куда войдут все файлы упоминавшиеся в FAQ, просто утилитки,
DBX-файлы
Читайте также: