Способы не записать функциональные заголовки дважды?

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

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

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

9
задан mee 26 May 2010 в 02:26
поделиться

8 ответов

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

#include "stdio.h"

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

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

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

0
ответ дан 2 November 2019 в 23:59
поделиться

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

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

1
ответ дан 2 November 2019 в 23:59
поделиться

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

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

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

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

0
ответ дан 2 November 2019 в 23:59
поделиться

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

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

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

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

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

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

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

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

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

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

11
ответ дан 2 November 2019 в 23:59
поделиться

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

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

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

#include <vector>

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

0
ответ дан 2 November 2019 в 23:59
поделиться

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

0
ответ дан 2 November 2019 в 23:59
поделиться

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

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

0
ответ дан 2 November 2019 в 23:59
поделиться

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

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

0
ответ дан 2 November 2019 в 23:59
поделиться