Створення власного файлу заголовка в C


Відповіді:


299

foo.h

#ifndef FOO_H_   /* Include guard */
#define FOO_H_

int foo(int x);  /* An example function declaration */

#endif // FOO_H_

foo.c

#include "foo.h"  /* Include the header (not strictly necessary here) */

int foo(int x)    /* Function definition */
{
    return x + 5;
}

main.c

#include <stdio.h>
#include "foo.h"  /* Include the header here, to obtain the function declaration */

int main(void)
{
    int y = foo(3);  /* Use the function here */
    printf("%d\n", y);
    return 0;
}

Для компіляції за допомогою GCC

gcc -o my_app main.c foo.c

2
@Anu: Я не можу прочитати це в такому форматі. Ви можете змінити своє оригінальне запитання, щоб включити цей код.
Олівер Чарльворт

3
Варто зазначити, що цей код не працює, якщо ви спробуєте просто створити його за допомогою кнопки ("побудувати та запустити" у коді :: Блоки, наприклад). Для вас це може здатися очевидним, але для мене це перший раз, і я зайняв досить багато часу, щоб зрозуміти, де проблема.
Jeyekomon

5
@Jeyekomon: Ну, де це проблема?
Олівер Чарльворт

2
Ніхто не сказав мені, що кнопка "побудувати та запустити" недостатня для всього. :-) Це було для мене зовсім несподіванкою (я новачок). Тепер я думаю, що я повинен навчитися спочатку використовувати командний рядок або makefiles.
Jeyekomon

1
Мені було цікаво, чи можна вам детальніше розібратися, як компілювати всі необхідні файли, і не потрібно включати foo.c в аргумент програми gcc. Як називається ця методика або яка програма може досягти цього поза межами IDE - Зробити це мені на думку
nf071590

26
#ifndef MY_HEADER_H
# define MY_HEADER_H

//put your function headers here

#endif

MY_HEADER_H служить охоронцем подвійного включення.

Для оголошення функції потрібно лише визначити підпис, тобто без імен параметрів, як це:

int foo(char*);

Якщо ви дійсно хочете, ви можете також включити ідентифікатор параметра, але це не обов'язково, оскільки ідентифікатор буде використовуватися лише в тілі функції (реалізації), який у випадку заголовка (підпис параметра) він відсутній.

Це оголошує функцію, fooяка приймає a char*і повертає int.

У вашому вихідному файлі ви матимете:

#include "my_header.h"

int foo(char* name) {
   //do stuff
   return 0;
}

Вони відомі як декларації функцій або прототипи функцій , а не "функції заголовків". Заголовки - це файли, які ви включаєте, а не декларації всередині них.
Джонатан

@JonathanWakely Це файли заголовків. Назва говорить про це все: файли заголовків містять заголовки. Але дякую за відгуки, це змусило мене задуматися на секунду.
Флавій

Ні, заголовки - це самі файли, а не декларації, які вони містять. Чи можете ви знайти єдину надійну посилання, щоб створити резервну копію використання "заголовка"? Наприклад, це суперечить K&R, стандарту C, середовищу програмування UNIX та Вікіпедії .
Джонатан

@JonathanWakely Ви насправді читали K&R? У TOC є розділ «4.5 файлів заголовка», а «файли заголовків» написані курсивом із зазначенням термінології. В решті книг автори іноді пишуть просто «заголовок» для стислості, але через форматування та TOC зрозуміло, що таке правильна термінологія. Тож будь ласка, будьте професіоналом і визнайте, коли ви помиляєтесь.
Флавій

Так, і "заголовок" посилається на файли , а не на декларації в них. У другому виданні див. Сторінку 241 для обговорення стандартних заголовків та сторінку 33, де йдеться про визначення та декларації (яку ви помилково називаєте "функціональні заголовки") та чітко визначає заголовок : "Звичайна практика - збирати externдекларації змінних та функції в окремому файлі, який історично називається заголовком , який міститься #includeв передній частині кожного вихідного файлу. Функції стандартної бібліотеки, наприклад, оголошуються у заголовках як <stdio.h>".
Джонатан

8

myfile.h

#ifndef _myfile_h
#define _myfile_h

void function();

#endif

myfile.c

#include "myfile.h"

void function() {

}

void function();як декларація не заважає дзвінкам типу function(42);. Використовуйте voidв декларації типуvoid function(void);
chux - Відновіть Моніку

5

файли заголовків містять прототипи для функцій, визначених у файлі .c або .cpp / .cxx (залежно від того, якщо ви використовуєте c або c ++). Ви хочете розмістити # ifndef / # визначає навколо свого .h коду, так що якщо ви включите один і той же .h двічі в різні частини ваших програм, прототипи включаються лише один раз.

client.h

#ifndef CLIENT_H
#define CLIENT_H

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize);


#endif /** CLIENT_H */

Тоді ви реалізуєте .h у файлі .c так:

client.c

#include "client.h"

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize) {
 short ret = -1;
 //some implementation here
 return ret;
}

"щоб увімкнути один і той же .h двічі в різних частинах ваших програм, прототипи включаються лише один раз." Це вводить в оману. Вони захищають від включення одного і того ж файлу заголовка двічі з одного і того ж вихідного файлу (включаючи заголовок двічі у двох різних вихідних файлах, це нормально, і зазвичай потрібно!), А повторне оголошення прототипів функцій не є проблемою, повторне визначення типів та глобальних змінних це те, чого треба оберігати.
Джонатан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.