#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);return0;}
@ 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.
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>. "
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,unsignedshort 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,unsignedshort port,char*sendbuf,char*recievebuf,long rbufsize){short ret =-1;//some implementation herereturn ret;}
"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.
Jawaban:
foo.h
foo.c
main.c
Untuk mengkompilasi menggunakan GCC
sumber
MY_HEADER_H
berfungsi sebagai penjaga inklusi ganda.Untuk deklarasi fungsi, Anda hanya perlu mendefinisikan tanda tangan, yaitu, tanpa nama parameter, seperti ini:
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
foo
yang menerimachar*
dan mengembalikanint
.Di file sumber Anda, Anda akan memiliki:
sumber
extern
deklarasi variabel dan fungsi dalam file terpisah, secara historis disebut header , yang disertakan oleh#include
di depan setiap file sumber. Fungsi perpustakaan standar, misalnya, dinyatakan dalam header seperti<stdio.h>
. "myfile.h
myfile.c
sumber
void function();
sebagai deklarasi tidak mencegah panggilan sepertifunction(42);
. Gunakanvoid
dalam deklarasi sepertivoid function(void);
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
Maka Anda akan mengimplementasikan .h dalam file .c seperti:
client.c
sumber