Membuat file header Anda sendiri di C

Jawaban:

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;
}

Untuk mengkompilasi menggunakan GCC

gcc -o my_app main.c foo.c
Oliver Charlesworth
sumber
2
@ Ain: Saya tidak bisa membacanya dalam format ini. Anda dapat mengedit pertanyaan awal Anda untuk memasukkan kode ini.
Oliver Charlesworth
3
Perlu dicatat bahwa kode ini tidak berfungsi jika Anda mencoba membangunnya hanya dengan tombol ("bangun dan jalankan" dalam Kode :: Blok misalnya). Ini mungkin terlihat jelas bagi Anda, tetapi bagi saya ini adalah pertama kalinya hal itu terjadi dan perlu beberapa waktu untuk mencari tahu di mana masalahnya.
Jeyekomon
5
@Jeyekomon: Nah, mana adalah masalah?
Oliver Charlesworth
2
Tidak ada yang mengatakan kepada saya bahwa tombol "bangun dan jalankan" tidak cukup untuk semuanya. :-) Itu cukup mengejutkan bagi saya (saya seorang pemula). Sekarang saya kira saya harus belajar menggunakan commandline atau makefile terlebih dahulu.
Jeyekomon
1
Saya bertanya-tanya apakah Anda bisa menguraikan cara mengkompilasi dengan semua file yang diperlukan dan tidak harus memasukkan foo.c ke dalam argumen program gcc. Apa yang disebut teknik ini atau program apa yang dapat mencapai hal ini di luar IDE - Buatlah terlintas dalam pikiran saya
nf071590
26
#ifndef MY_HEADER_H
# define MY_HEADER_H

//put your function headers here

#endif

MY_HEADER_H berfungsi sebagai penjaga inklusi ganda.

Untuk deklarasi fungsi, Anda hanya perlu mendefinisikan tanda tangan, yaitu, tanpa nama parameter, seperti ini:

int foo(char*);

Jika Anda benar-benar ingin, Anda juga dapat menyertakan pengidentifikasi parameter, tetapi itu tidak perlu karena pengidentifikasi hanya akan digunakan dalam tubuh fungsi (implementasi), yang dalam hal header (tanda tangan parameter), itu tidak ada.

Ini menyatakan fungsi fooyang menerima char*dan mengembalikan int.

Di file sumber Anda, Anda akan memiliki:

#include "my_header.h"

int foo(char* name) {
   //do stuff
   return 0;
}
Flavius
sumber
Mereka dikenal sebagai deklarasi fungsi atau prototipe fungsi , bukan "header fungsi". Header adalah file yang Anda masukkan, bukan deklarasi di dalamnya.
Jonathan Wakely
@ JonathanWakely Itu adalah file header. Namanya menceritakan semuanya: file header berisi header. Tapi terima kasih atas umpan baliknya, itu membuat saya berpikir sejenak.
Flavius
Tidak, header adalah file itu sendiri, bukan deklarasi yang dikandungnya. Dapatkah Anda menemukan referensi tunggal yang memiliki reputasi baik untuk mendukung penggunaan "header" Anda? Ini bertentangan dengan K&R, standar C, Lingkungan Pemrograman UNIX , dan Wikipedia , misalnya.
Jonathan Wakely
@Jonathan. Benarkah Anda sudah benar-benar membaca K&R? TOC memiliki bagian "4,5 file header" dan "file header" ditulis dengan huruf miring, yang menunjukkan terminologi. Dalam sisa buku ini, penulis kadang-kadang menulis hanya "header" untuk singkatnya, tetapi melalui pemformatan dan TOC jelas apa terminologi yang tepat. Jadi tolong, jadilah profesional dan kenali kalau Anda salah.
Flavius
Ya, dan "header" mengacu pada file , bukan deklarasi di dalamnya. Dalam edisi ke-2 lihat halaman 241 untuk pembahasan header standar, dan halaman 33 yang berbicara tentang definisi dan deklarasi (yang secara keliru Anda sebut "header fungsi") dan dengan jelas mendefinisikan header : "Praktek yang biasa adalah mengumpulkan externdeklarasi variabel dan fungsi dalam file terpisah, secara historis disebut header , yang disertakan oleh #includedi depan setiap file sumber. Fungsi perpustakaan standar, misalnya, dinyatakan dalam header seperti <stdio.h>. "
Jonathan Wakely
8

myfile.h

#ifndef _myfile_h
#define _myfile_h

void function();

#endif

myfile.c

#include "myfile.h"

void function() {

}
TommyGunn32
sumber
void function();sebagai deklarasi tidak mencegah panggilan seperti function(42);. Gunakan voiddalam deklarasi sepertivoid function(void);
chux - Reinstate Monica
5

file header berisi prototipe untuk fungsi yang Anda tetapkan dalam file .c atau .cpp / .cxx (tergantung jika Anda menggunakan c atau c ++). Anda ingin menempatkan # ifndef / # mendefinisikan sekitar kode .h Anda sehingga jika Anda memasukkan .h yang sama dua kali di berbagai bagian program Anda, prototipe hanya disertakan satu kali.

client.h

#ifndef CLIENT_H
#define CLIENT_H

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


#endif /** CLIENT_H */

Maka Anda akan mengimplementasikan .h dalam file .c seperti:

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;
}
djsumdog
sumber
"sehingga jika Anda memasukkan .h yang sama dua kali di bagian yang berbeda dari program Anda, prototipe hanya disertakan satu kali." Ini menyesatkan. Mereka menjaga agar tidak menyertakan file header yang sama dua kali dari file sumber yang sama (termasuk header dua kali dalam dua file sumber berbeda ok, dan biasanya diperlukan!) Dan menyatakan kembali prototipe fungsi bukan masalah, mendefinisikan ulang tipe dan variabel global adalah apa yang harus dijaga.
Jonathan Wakely