Как сделать исходный файл

Добавил пользователь Алексей Ф.
Обновлено: 05.10.2024

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

Термины

Пара слов о терминах. Ниже даны определения терминов так, как они используются в данной статье. В некоторых случаях эти определения имеют более узкий смысл, чем общепринятые. Это сделано намеренно, дабы не утонуть в деталях и лишних уточнениях.

Исходный код — программа, написанная на языке программирования, в текстовом формате. А также текстовый файл, содержащий исходный код.

Компилятор — программа, выполняющая компиляцию (неожиданно! не правда ли?). На данный момент среди начинающих наиболее популярными компиляторами C/C++ являются GNU g++ (и его порты под различные ОС) и MS Visual Studio C++ различных версий. Подробнее см. в Википедии статьи: Компиляторы, Компиляторы C++.

Компиляция — преобразование исходного кода в объектный модуль.

Объектный модуль — двоичный файл, который содержит в себе особым образом подготовленный исполняемый код, который может быть объединён с другими объектными файлами при помощи редактора связей (компоновщика) для получения готового исполняемого модуля, либо библиотеки. (подробности)

Исполняемый модуль (исполняемый файл) — файл, который может быть запущен на исполнение процессором под управлением операционной системы. (подробности)

Препроцессор — программа для обработки текста. Может существовать как отдельная программа, так и быть интегрированной в компилятор. В любом случае, входные и выходные данные для препроцессора имеют текстовый формат. Препроцессор преобразует текст в соответствии с директивами препроцессора. Если текст не содержит директив препроцессора, то текст остаётся без изменений. Подробнее см. в Википедии: Препроцессор и Препроцессор Си.

IDE (англ. Integrated Development Environment) — интегрированная среда разработки. Программа (или комплекс программ), предназначенных для упрощения написания исходного кода, отладки, управления проектом, установки параметров компилятора, линкера, отладчика. Важно не путать IDE и компилятор. Как правило, компилятор самодостаточен. В состав IDE компилятор может не входить. С другой стороны с некоторыми IDE могут быть использованы различные компиляторы. (подробности)

Объявление — описание некой сущности: сигнатура функции, определение типа, описание внешней переменной, шаблон и т.п. Объявление уведомляет компилятор о её существовании и свойствах.

Определение — реализация некой сущности: переменная, функция, метод класса и т.п. При обработке определения компилятор генерирует информацию для объектного модуля: исполняемый код, резервирование памяти под переменную и т.д.

От исходного кода к исполняемому модулю

Создание исполняемого файла издавна производилось в три этапа: (1) обработка исходного кода препроцессором, (2) компиляция в объектный код и (3) компоновка объектных модулей, включая модули из объектных библиотек, в исполняемый файл. Это классическая схема для компилируемых языков. (Сейчас уже используются и другие схемы.)

Часто компиляцией программы называют весь процесс преобразования исходного кода в исполняемы модуль. Что неправильно. Обратите внимание, что в IDE этот процесс называется построение (build) проекта.

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

Затем результат работы препроцессора передаётся компилятору. Компилятор производит весь положенный комплекс работ: от синтаксического разбора и поиска ошибок до создания объектного файла (понятно, что если имеются синтаксические ошибки, то объектный файл не создаётся). В объектном файле обычно имеется таблица внешних ссылок — некая таблица, в которой, в частности, перечислены имена подпрограмм, которые используются в объектном модуле, но код которых отсутствует в данном объектном модуле. Эти подпрограммы внешние по отношению к модулю.

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

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

Необходимые объектные библиотеки входят в комплект поставки компилятора. В комплект поставки библиотек (любых) входит набор заголовочных файлов, которые содержат объявления, необходимые компилятору.

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

Разделение текста программы на модули

Разделение исходного текста программы на несколько файлов становится необходимым по многим причинам:

  1. С большим текстом просто неудобно работать.
  2. Разделение программы на отдельные модули, которые решают конкретные подзадачи.
  3. Разделение программы на отдельные модули, с целью повторного использования этих модулей в других программах.
  4. Разделение интерфейса и реализации.

Как только мы решаем разделить исходный текст программы на несколько файлов, возникают две проблемы:

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

Первая проблема — чисто техническая. Она решается чтением руководств по компилятору и/или линкеру, утилите make или IDE. В самом худшем случае просто придётся проштудировать все эти руководства. Поэтому на решении этой проблемы мы останавливаться не будем.

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

Во-вторых, нужно определить интерфейсы для модулей. Здесь есть вполне чёткие правила.

Интерфейс и реализация

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

Таким образом, модуль состоит из двух файлов: заголовочного (интерфейс) и файла реализации.

Заголовочный файл, как правило, имеет расширение .h или .hpp, а файл реализации — .cpp для программ на C++ и .c, для программ на языке C. (Хотя в STL включаемые файлы вообще без расширений, но, по сути, они являются заголовочными файлами.)

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

Что может быть в заголовочном файле

Правило 1. Заголовочный файл может содержать только объявления. Заголовочный файл не должен содержать определения.

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

Аналогичная ситуация и с объявлением переменных-членов класса: код будет порождаться при создании экземпляра этого класса.

Правило 2. Заголовочный файл должен иметь механизм защиты от повторного включения.

Защита от повторного включения реализуется директивами препроцессора:

Заголовочный файл сам по себе не является единицей компиляции.

Что может быть в файле реализации

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

Правило 3. В файле реализации должна быть директива включения соответствующего заголовочного файла.

Понятно, что объявления, которые видны снаружи модуля, должны быть также доступны и внутри.

Правило также гарантирует соответствие между описанием и реализацией. При несовпадении, допустим, сигнатуры функции в объявлении и определении компилятор выдаст ошибку.

Правило 4. В файле реализации не должно быть объявлений, дублирующих объявления в соответствующем заголовочном файле.

При выполнении Правила 3, нарушение Правила 4 приведёт к ошибкам компиляции.

Практический пример

Допустим, у нас имеется следующая программа:

main.cpp

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

Итак, что у нас имеется?

  1. глобальная константа cint , которая используется и в классе, и в main ;
  2. глобальная переменная global_var , которая используется в функциях func1 , func2 и main ;
  3. глобальная переменная module_var , которая используется только в функциях func1 и func2 ;
  4. функции func1 и func2 ;
  5. класс CClass ;
  6. функция main .

Вроде вырисовываются три единицы компиляции: (1) функция main , (2) класс CClass и (3) функции func1 и func2 с глобальной переменной module_var , которая используется только в них.

Не совсем понятно, что делать с глобальной константой cint и глобальной переменной global_var . Первая тяготеет к классу CClass , вторая — к функциям func1 и func2 . Однако предположим, что планируется и эту константу, и эту переменную использовать ещё в каких-то, пока не написанных, модулях программы. Поэтому прибавится ещё одна единица компиляции.

Теперь пробуем разделить программу на модули.

Сначала, как наиболее связанные сущности (используются во многих местах программы), выносим глобальную константу cint и глобальную переменную global_var в отдельную единицу компиляции.

globals.h

globals.cpp

Обратите внимание, что глобальная переменная в заголовочном файле имеет спецификатор extern . При этом получается объявление переменной, а не её определение. Такое описание означает, что где-то существует переменная с таким именем и указанным типом. А определение этой переменной (с инициализацией) помещено в файл реализации. Константа описана в заголовочном файле.

Также обратите внимание (1) на защиту от повторного включения заголовочного файла и (2) на включение заголовочного файла в файле реализации.

Затем выносим в отдельный модуль функции func1 и func2 с глобальной переменной module_var . Получаем ещё два файла:

funcs.h

funcs.cpp

Наконец выносим в отдельный модуль класс CClass :

CClass.h

CClass.cpp

Обратите внимание на следующие моменты.

(1) Из объявления класса убрали определения тел функций (методов). Это сделано по идеологическим причинам: интерфейс и реализация должны быть разделены (для возможности изменения реализации без изменения интерфейса). Если впоследствии будет необходимость сделать какие-то методы инлайновыми, это всегда можно сделать с помощью спецификатора.

(2) Класс имеет статический член класса. Т.е. для всех экземпляров класса эта переменная будет общей. Её инициализация выполняется не в конструкторе, а в глобальной области модуля.

Классы практически всегда выделяются в отдельные единицы компиляции.

В файле main.cpp оставляем только функцию main . И добавляем необходимые директивы включения заголовочных файлов.

main.cpp

Типичные ошибки

Ошибка 1. Определение в заголовочном файле.

Ошибка 2. Отсутствие защиты от повторного включения заголовочного файла.

Ошибка 3. Несовпадение объявления в заголовочном файле и определения в файле реализации.

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

Ошибка 5. Отсутствие необходимого модуля в проекте построения программы.

Ошибка 6. Зависимость от порядка включения заголовочных файлов.

Не совсем ошибка, но таких ситуаций следует избегать. Обычно сигнализирует либо об ошибках в проектировании программы, либо об ошибках при разделении исходного кода на модули.

Заключение

В рамках небольшой статьи невозможно рассмотреть все случаи, возникающие при раздельной компиляции. Бывают ситуации, когда разделение программы или большого модуля на более мелкие кажется невозможным. Обычно это бывает, когда программа плохо спроектирована (в данном случае, части кода имеют сильные взаимные связи). Конечно, можно приложить дополнительные усилия и всё-таки разделить код на модули (или оставить как есть), но эту мозговую энергию лучше потратить более эффективно: на изменение структуры программы. Это принесёт в дальнейшем гораздо большие дивиденды, чем просто силовое решение.

Преобразование Word в PDF онлайн

Документы PDF можно создать путем преобразования других документов и ресурсов в формат Portable Document Format (PDF). Обычно имеется возможность выбора одного из нескольких способов создания файла PDF в зависимости от типа исходного файла.

Если файл открыт в исходном приложении (например, электронная таблица открыта в Microsoft Excel), вы можете преобразовывать его в формат PDF, не открывая Adobe Acrobat. Точно так же, если программа Acrobat уже открыта, то не требуется открывать исходное приложение для преобразования файла в PDF.

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

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

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

Большинство файлов

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

Принтер Adobe PDF

На рабочем столе или из папки.

На рабочем столе или в папке с помощью нажатия правой кнопкой мыши.

Бумажные документы

Необходим сканер и печатная копия документа.

Документы Microsoft Office

PDFMaker (только Windows)

В исходном приложении с помощью панели инструментов Acrobat PDFMaker и с помощью меню Adobe PDF . В приложениях Microsoft Office 2010 и более поздних версиях отображается на ленте Acrobat или Adobe PDF.

Сохранение как Adobe PDF (macOS)

Принтер Adobe PDF (только Windows)

На рабочем столе или из папки.

Контекстное меню (только Windows)

На рабочем столе или в папке с помощью нажатия правой кнопкой мыши.

PDFMaker (только Windows)

Принтер Adobe PDF (только Windows)

Контекстное меню (Outlook 2010 или более поздняя версия)

Веб-страницы

В Acrobat с помощью пункта меню PDF из веб-страницы .

PDFMaker (только Windows)

В Internet Explorer , Google Chrome или Firefox или при редактировании в исходном веб-приложении, которое поддерживает PDFMaker, например, Word. А также на панели инструментов Acrobat PDFMaker и в меню Adobe PDF .

Принтер Adobe PDF (Windows 7)

На рабочем столе или из папки путем перетаскивания файла HTML.

Контекстное меню (файлы HTML)

На рабочем столе или в папке с помощью нажатия правой кнопкой мыши по файлу HTML.

Содержимое, скопированное в буфер обмена

Файлы AutoCad (только Acrobat Pro для Windows)

В AutoCAD с помощью панели инструментов Acrobat PDFMaker или меню Adobe PDF .

Принтер Adobe PDF

На рабочем столе или из папки.

На рабочем столе или в папке с помощью нажатия правой кнопкой мыши.

Файлы Adobe Photoshop (PSD), Adobe Illustrator (AI) и Adobe InDesign (INDD)

С рабочего стола или из папки в окно или на значок Acrobat

Файлы PostScript и EPS

На рабочем столе или из папки путем перетаскивания на значок Acrobat Distiller или в окно Acrobat Distiller ®.

(Только файлы PostScript®) На рабочем столе или в папке.

На рабочем столе или в папке с помощью нажатия правой кнопкой мыши.

3D-файлы (Acrobat Pro)

В программе Acrobat Pro , выбрав PDF на основе файла .

На рабочем столе или из папки.

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

Выбранные один раз, эти параметры применяются в PDFMaker, Acrobat и Acrobat Distiller . Тем не менее, некоторые параметры применимы только в ограниченных контекстах или для определенных типов файлов. Например, параметры PDFMaker могут различаться в разных приложениях Microsoft Office .

Для удобства можно выбрать один из наборов параметров преобразования, доступных в Acrobat. Также можно создавать, определять, сохранять и повторно использовать пользовательские стили, которые наилучшим образом подходят для выполнения определенных задач.

Заключение: Можно ли восстановить предыдущую версию документа Microsoft Word в Office 2019/2016/2010/2007/2011/2013, даже если вы выполняли другие операции в текущем файле? Если вы случайно перезаписали файл Word и сохранили новые изменения, просто получите здесь простые решения, чтобы вернуться к подходящей версии, которая вам нужна.

«Как вернуть старую версию файла Word в Office 2016? Я привык сохранять файл при работе с Ctrl + S. Но по ошибке сохранил не тот файл. Кто-нибудь знает, как восстановить предыдущую версию документа Word? "

Восстановить предыдущую версию Word Document

По разным причинам вы можете вернуться к предыдущей версии документа Word. Например, происходит сбой, внезапно отключается питание, вы перезаписываете нужный файл и сохраняете результат, а случайно закрываете файл без сохранения. Вот и возникает вопрос, как это сделать?

Часть 1. Восстановление предыдущей версии документа Word с помощью функции автоматического восстановления

Автосохранение — очень полезная функция, которая поможет вам сохранять вашу работу каждые X минут в зависимости от настроек. Поэтому вам нужно убедиться, что опция AutoRecover включена. В этом случае он будет сохранять версии, пока вы работаете над документом Word. Затем вы можете воспользоваться следующим руководством, чтобы восстановить предыдущую версию документа Word.

Восстановите предыдущий документ Word, если вы сохранили файл

Шаг 1 Откройте файл Word, который вы хотите вернуть к старой версии. щелчок Файл и затем выберите Инфо.

Шаг 2 Найдите Управление документами и щелкните по нему. В раскрывающемся списке выберите файл, помеченный при закрытии без сохранения.

Управление документом

Шаг 3 Нажмите Восстановить Кнопка для восстановления предыдущей версии документа Word в верхней строке меню.

Восстановить предыдущий документ Word несохраненным

Восстановите предыдущую версию Word, если вы не сохранили файл

Шаг 1 Первый шаг будет таким же, нужно нажать Файл и затем выберите Инфо.

Шаг 2 Предусмотрено два варианта: восстановить несохраненные документы и удалить все несохраненные документы. Здесь нужно выбрать Восстановление несохраненных документов .

Управление документом

Шаг 3 Выберите файл и нажмите Откройте. Затем нажмите Сохранить как чтобы сохранить файл и перейти к предыдущей версии документа Word.

Сохранить как

Часть 2. Непосредственно найти и восстановить файл предыдущего слова из временных файлов

На самом деле, когда вы создаете и редактируете файл Word на своем компьютере, многие временные файлы сохраняются. Если вам нужно восстановить предыдущую версию файла Word, вы можете попробовать найти эти файлы в определенных местах.

Расположение временного файла на ПК с Windows 7:

C: \ Users \ имя \ AppData \ Roaming \ Microsoft \ Excel \

C: \ Users \ имя \ AppData \ Roaming \ Microsoft \ Word \

Расположение временного файла на ПК с Windows 8/10:

C: \ Users \\ AppData \ Local \ Microsoft \ Office \ UnsavedFiles \

Когда вы найдете предыдущую версию файла Word, вам нужно скопировать его по другому пути. Более того, вам нужно изменить файл с .tmp на .xls/.xlsx или .doc/.docx. После этого вы просто закончите процесс восстановления старой версии документа Word.

Часть 3. Восстановление старых файлов Word и возврат к предыдущим версиям

С первыми двумя способами у вас есть большие шансы восстановить предыдущую версию документа Word в Office 2019/2016/2010/2007/2011/2013. А как насчет файлов Word, которые вы удалили по ошибке? Что делать, если вы не можете найти их в корзине?

Aiseesoft Data Recovery — это многофункциональный инструмент для восстановления данных, который поможет вам с легкостью восстановить удаленные/потерянные файлы Word.

Он в основном предназначен для извлечения всех видов файлов документов, таких как Word, Excel и PowerPoint. Поэтому, если вы хотите вернуться к старой версии Word, вам следует попробовать. Кроме того, если ваш файл Word поврежден, несохраненные, удаленные и т. д. это также делает вам большую пользу.

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

Шаг 1 Запустите Aiseesoft Data Recovery

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

Шаг 2 Выберите тип данных и жесткий диск

На этом этапе вам нужно выбрать тип данных и местоположение. Теперь Документ это вариант, который вы должны выбрать. Затем выберите диск (и), где вы можете восстановить эти файлы Word.

Запустите Aiseesoft Data Recovery

Шаг 3 Сканирование старых файлов Word

Сканирование старых файлов Word

Шаг 4 Восстановить предыдущие файлы Word

Восстановить предыдущую версию Word Document

Если вы работаете на Mac, просто проверьте эту страницу, чтобы верни свой документ Word из предыдущей версии или несохраненной версии.

Что вы думаете об этом посте.

Рейтинг: 4.8 / 5 (на основе голосов 12)

29 декабря 2020 г. 11:23 / Автор: Аманда Браун в File Recovery

В этой статье представлен конвертер PDF в Word для пользователей Mac и показано, как конвертировать PDF в документ Word в Mac OS.

Это пошаговая статья, в которой рассказывается, как легко конвертировать PDF в редактируемый файл Excel.

Какой лучший редактор PDF для редактирования файла PDF? На этой странице вы найдете 10 лучших программ для редактирования PDF.

Вот то, как создать основную MEX-функцию C++. Эта функция только добавляет смещение к каждому элементу входного массива, чтобы продемонстрировать основной ввод и вывод. Для более детального обсуждения создания исходного кода MEX-функции смотрите Структуру MEX-функции C++ и похожих тем.

Создание файла исходного кода

Используя ваш редактор, создайте файл с .cpp расширение и добавляет, прокомментировали инструкции. Например, MyMEXFunction.cpp .

Добавьте необходимые заголовочные файлы

Для MEX-функций C++ добавьте эти заголовочные файлы.

Используя определения удобства

Опционально задайте пространство имен для matlab::data и задайте другие удобства.

Задайте класс MexFunction

Все MEX-функции C++ реализованы как класс под названием MexFunction . Этот класс должен вывести из matlab::mex::Function .

Задайте оператор ()

Весь MexFunction классы должны заменить оператор вызова функции, operator() , принять два аргумента типа matlab::mex::ArgumentList . Эти аргументы содержат вводы и выводы.

Добавьте функцию членства, чтобы проверять аргументы

Протестируйте, чтобы видеть, имеют ли аргументы правильный тип и размер. Если тесты перестали работать, вызовите MATLAB ® error функция.

Реализуйте расчет

Получите скалярное смещение и присвойте его const double . Получите входной массив и переместите его в matlab::data::TypedArray работать над массивом. Добавьте смещение к каждому элементу в массиве и присвойте модифицированный массив выходной переменной.

Setup и сборка

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

Для получения дополнительной информации о создании MEX-функций смотрите Сборку Программы C++ MEX.

Вызовите MEX-функцию

Вызовите свою MEX-функцию из MATLAB.

Смотрите также

Похожие темы

Документация MATLAB

Поддержка

© 1994-2021 The MathWorks, Inc.

1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.

2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.

3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.

4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.

Читайте также: