Способы не писать заголовки функций дважды? - PullRequest
9 голосов
/ 26 мая 2010

У меня вопрос на C / C ++, могу ли я повторно использовать функции в разных объектных файлах или проектах, не записывая заголовки функций дважды? (один для определения функции и один для ее объявления)

Я не очень разбираюсь в C / C ++, Delphi и D. Я предполагаю, что в Delphi или D вы просто один раз напишите, какие аргументы принимает функция, и затем вы можете использовать эту функцию в разных проектах. И в C вам нужно объявление функции в заголовочных файлах * снова ??, верно ?. Есть хороший инструмент, который будет создавать заголовочные файлы из C-источников? У меня есть один, но он не знает препроцессора и не очень строг. И у меня была какая-то макро техника, которая работала довольно плохо.

Я ищу способы программирования на C / C ++, как описано здесь http://www.digitalmars.com/d/1.0/pretod.html

Ответы [ 8 ]

11 голосов
/ 26 мая 2010

Имхо, генерация заголовков из источника - плохая идея и нецелесообразна.

Заголовки могут содержать больше информации, чем просто имена функций и параметры.

Вот несколько примеров:

  • C++ может определять класс abstract , для которого исходный файл может быть не нужен
  • Шаблон может быть определен только в заголовочном файле
  • Параметры по умолчанию указываются только в определении класса (таким образом, в заголовочном файле)

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

Я думаю, что наоборот - нелогично и не соответствует духу C или C++.

Единственное исключение заключается в том, что static функции. Статическая функция появляется только в исходном файле (.c или .cpp) и не может (очевидно) использоваться в другом месте.

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

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

Кроме того, просто чтобы упомянуть, нет такой вещи как C/C++: есть C и есть C++; это разные языки (которые действительно имеют много общего, но все же).

1 голос
/ 26 мая 2010

Мне кажется, что вам не нужно / не нужно автоматически генерировать заголовки из источника; Вы хотите иметь возможность писать один файл и иметь инструмент, который может интеллектуально разделить его на файл заголовка и исходный файл.

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

0 голосов
/ 26 мая 2010

Вы можете просто поместить все определения в заголовочный файл ...

Это противоречит обычной практике , но не является неслыханным из .

0 голосов
/ 26 мая 2010

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

0 голосов
/ 26 мая 2010

Я думаю, что это хороший вопрос, который заставил меня спросить: Visual studio: автоматически обновлять C ++ файл cpp / header при изменении другого?

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

0 голосов
/ 26 мая 2010

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

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

Технически, заголовочный файл - это просто набор текста, который фактически вставляется препроцессором в исходный файл:

#include <vector>

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

0 голосов
/ 26 мая 2010

Это похоже на рудиментарный вопрос, поэтому, если я не прочитал, Вот базовый пример повторного использования, чтобы ответить на ваш первый вопрос:

#include "stdio.h"

int main( int c, char ** argv ){
    puts( "Hello world" );
}

Пояснение: 1. stdio.h - это заголовочный файл C, содержащий (помимо прочего) определение функции, называемой put (). 2. в основном вызывается метод put () из включенного определения.

Некоторые компиляторы (включая gcc, я думаю) имеют возможность генерировать заголовки.

0 голосов
/ 26 мая 2010

Учитывая, что вы объявили некоторые функции и написали их реализацию, у вас будет файл .c / cpp и заголовочный файл .h.

Что вы должны сделать, чтобы использовать эти функции:

  1. Создайте библиотеку (DLL / so или статическую библиотеку .a / .lib - пока я рекомендую статическую библиотеку для простоты использования) из файлов, в которых находится реализация
  2. Используйте файл заголовка (#include it) (вам не нужно для перезаписи файла заголовка снова) в ваших программах, чтобы получить определения функций и связать их с вашей библиотекой из шага 1.

Хотя> этот <является примером для Visual Studio, он также имеет смысл для других сред разработки. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...