Как я могу создать заголовочные файлы C

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


person user340838    schedule 14.05.2010    source источник
comment
с текстовым редактором?   -  person stefanB    schedule 14.05.2010
comment
Если я правильно понимаю, вы хотите создать библиотеку, аналогичную стандартным библиотекам C, поэтому вы включаете файл заголовка с определениями функций, а затем связываете эту библиотеку при создании окончательного исполняемого файла. Это правильно?   -  person Conspicuous Compiler    schedule 14.05.2010


Ответы (2)


  1. Откройте ваш любимый текстовый редактор
  2. Создайте новый файл с именем what.h
  3. Поместите в него свои прототипы функций

ГОТОВО.

Пример что угодно.h

#ifndef WHATEVER_H_INCLUDED
#define WHATEVER_H_INCLUDED
int f(int a);
#endif

Примечание: включите защиту (команды препроцессора), добавленную благодаря Люку. Они избегают включения одного и того же заголовочного файла дважды в одну и ту же компиляцию. Другая возможность (также упомянутая в комментариях) — добавить #pragma once, но не гарантируется, что она будет поддерживаться каждым компилятором.

Пример

#include "whatever.h"

int f(int a) { return a + 1; }

И затем вы можете включить "whatever.h" в любой другой файл .c и связать его с объектным файлом what.c.

Так:

образец.с

#include "whatever.h"

int main(int argc, char **argv)
{
    printf("%d\n", f(2)); /* prints 3 */
    return 0;
}

Чтобы скомпилировать его (если вы используете GCC):

$ gcc -c whatever.c -o whatever.o
$ gcc -c sample.c -o sample.o

Чтобы связать файлы для создания исполняемого файла:

$ gcc sample.o whatever.o -o sample

Вы можете протестировать образец:

$ ./sample
3
$
person Pablo Santa Cruz    schedule 14.05.2010
comment
вы можете упомянуть защиту заголовка - person luke; 14.05.2010
comment
@luke: Большое спасибо. Понятия не имею, что такое защита заголовка. Сейчас пойду гуглить. Спасибо еще раз. - person Pablo Santa Cruz; 14.05.2010
comment
@люк: о! Понимаю. Хорошая точка зрения. Собираюсь добавить их. - person Pablo Santa Cruz; 14.05.2010
comment
о, извините, я их так называю (не уверен, что это стандарт). защита заголовка — это когда вы оборачиваете файл заголовка в #ifndef HEADER_FILE_NAME_H #define HEADER_FILE_NAME_H //определить заголовок в ifndef, это гарантирует, что заголовок включается только после предотвращения компилятора ошибки #endif - person luke; 14.05.2010
comment
@luke Их официально называют охранниками, но ваш термин довольно распространен. Есть также #pragma once, нестандартный, но широко поддерживаемый и (на мой взгляд) намного проще. - person Michael Mrozek; 14.05.2010
comment
Это хорошо, но нельзя ли сказать, что делает функция в заголовочном файле? Существует ли какая-либо другая форма модульного программирования? - person user340838; 14.05.2010
comment
Плюс 1 за добавление комментариев. Почему бы не сделать это правильно и не использовать DoxyGen, пока вы об этом? - person Mawg says reinstate Monica; 14.05.2010
comment
Хм, разве эти функции не должны быть «внешними» в заголовочном файле? - person Mawg says reinstate Monica; 14.05.2010
comment
@mawg: лично я всегда добавляю «внешний», но технически это излишне. Другой пункт — убедиться, что заголовок можно использовать сам по себе. Например, предположим, что одна из функций использует аргумент size_t. Если вы включаете <stddef.h> (наименьший заголовок, который typedef size_t), то заголовок может быть включен где угодно. См. стандарт кодирования Центра космических полетов имени Годдарда НАСА (в частности, стандарт кодирования C). - person Jonathan Leffler; 14.05.2010
comment
Привет. Я изучаю makefiles сейчас. Как будет выглядеть make-файл для приведенного выше примера? - person kk.; 05.07.2010
comment
Следует отметить, что базовая структура заголовочного файла не нуждается в #ifndef, #define или #end. Кроме того, новичку не очень понятно, что делают эти вещи. Может быть, какое-то уточнение? - person Eric Brotto; 13.02.2011
comment
Вместо того, чтобы сначала создавать два объектных файла, а затем связывать их, чтобы сделать исполняемый файл, есть ли какой-нибудь короткий способ сделать это? - person Abhishek Gupta; 14.07.2012
comment
Я спрашиваю, потому что при написании файла make мы обычно упоминаем файл .h при создании объектного файла. Мы не упоминаем об этом при создании исполняемого файла. Как указано в GNU Make Doc Chapter-2, Topic- A simple make file - person Abhishek Gupta; 14.07.2012
comment
@PabloSantaCruz Я новичок в Cи header files. Я сомневаюсь. Обязательно ли имя файла заголовка и файла, содержащего определение прототипов, имеют одно и то же имя? В вашем случае whatever.hи whatever.c. или есть stdio.h и stdio.cвсегда? - person noufal; 10.10.2013
comment
@noufal Нет, в этом нет необходимости. - person Pablo Santa Cruz; 10.10.2013
comment
@PabloSantaCruz, тогда где компилятор будет искать определение функции для прототипов, объявленных в файле .h? потому что мы не даем никакой подсказки, где определены функции. - person noufal; 11.10.2013
comment
Что, если прототип функции использует что-то вроде size_t? - person Koray Tugay; 06.06.2015

Файлы заголовков могут содержать любой допустимый код C, поскольку они внедряются в модуль компиляции препроцессором перед компиляцией.

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

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

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

person Bryan Ash    schedule 28.08.2013