C'de kendi başlık dosyanızı oluşturma


Yanıtlar:


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 kullanarak derlemek

gcc -o my_app main.c foo.c

2
@Anu: Bunu bu formatta okuyamıyorum. Orijinal kodunuzu bu kodu içerecek şekilde düzenleyebilirsiniz.
Oliver Charlesworth

3
Sadece kod ile oluşturmaya çalışırsanız bu kodun işe yaramadığını belirtmek gerekir (örneğin, Code :: Blocks'ta "oluştur ve çalıştır"). Sizin için açık görünebilir, ancak benim için ilk kez oldu ve sorunun nerede olduğunu bulmak oldukça zaman aldı.
Jeyekomon

5
@Jeyekomon: Well, nerede olduğunu sorun?
Oliver Charlesworth

2
Kimse bana "inşa et ve çalıştır" düğmesinin her şey için yeterli olmadığını söylemedi. :-) Benim için oldukça sürpriz oldu (ben bir acemi). Şimdi sanırım önce komut satırını veya makefiles'ı kullanmayı öğrenmeliyim.
Jeyekomon

1
Tüm gerekli dosyalarla nasıl derleneceğinizi ve gcc program argümanına foo.c eklemeniz gerekmeyeceğini merak ediyordum. Bu tekniğe ne denir ya da IDE dışında bunu hangi programla başarabilirim - Marka aklıma geliyor
nf071590

26
#ifndef MY_HEADER_H
# define MY_HEADER_H

//put your function headers here

#endif

MY_HEADER_H çift ​​inklüzyon koruması olarak görev yapar.

İşlev bildirimi için yalnızca imzayı, yani parametre adları olmadan, şöyle tanımlamanız gerekir:

int foo(char*);

Gerçekten istiyorsanız, parametrenin tanımlayıcısını da ekleyebilirsiniz, ancak gerekli değildir, çünkü tanımlayıcı yalnızca bir başlık (parametre imzası) durumunda eksik olan bir işlevin gövdesinde (uygulama) kullanılır.

Bu, a'yıfoo kabul eden char*ve an döndüren işlevi bildirirint .

Kaynak dosyanızda:

#include "my_header.h"

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

Bunlar işlev bildirimleri veya işlev prototipleri olarak bilinir , "işlev başlıkları" olarak bilinmez . Üstbilgiler, içerdiğiniz bildirimler değil, eklediğiniz dosyalardır.
Jonathan Wakely

@JonathanWakely Bunlar başlık dosyalarıdır. Ad her şeyi söyler: başlık dosyaları üstbilgi içerir. Ama geri bildirim için teşekkürler, beni bir saniyeliğine düşündürdü.
Flavius

Hayır, başlıklar dosyaların içerdikleri, içerdikleri bildirimler değil. "Üstbilgi" kullanımınızı yedeklemek için tek bir saygın referans bulabilir misiniz? Örneğin , K&R, C standardı, UNIX Programlama Ortamı ve Wikipedia ile çelişiyor .
Jonathan Wakely

@JonathanWakely K&R'yi gerçekten okudun mu? İçindekiler bölümünde "4.5 Başlık dosyaları" bölümü bulunur ve "başlık dosyaları" italik olarak yazılır ve terminolojiyi gösterir. Kitabın geri kalanında yazarlar bazen kısalık için sadece "başlık" yazarlar, ancak biçimlendirme ve TOK aracılığıyla doğru terminolojinin ne olduğu açıktır. Bu yüzden lütfen profesyonel olun ve yanıldığınızı anlayın.
Flavius

Evet ve "üstbilgi" dosyalardaki bildirimleri değil, dosyaları belirtir . 2 baskısında bahsediyor standart başlıkları tartışmaya ve sayfanın 33 için sayfa 241 bakın tanımları ve bildirimleri açıkça (yanlışlıkla "fonksiyonu başlıklarını" adını verir) ve tanımlar başlığı : "olağan bir uygulama toplamak için externdeğişkenlerin bildirimleri ve tarihsel olarak adlandırılan ayrı bir dosyada, fonksiyonlar başlık dahil olup, #includeher kaynak dosyasının ön. standart kütüphanenin işlevleri, örneğin, gibi başlıklarda beyan edilmektedir <stdio.h>."
Jonathan Wakely

8

myfile.h

#ifndef _myfile_h
#define _myfile_h

void function();

#endif

myfile.c

#include "myfile.h"

void function() {

}

void function();bir deklarasyon gibi çağrıları engellemez function(42);. Kullanım voidiçinde bildiriminde gibivoid function(void);
chux - Eski Monica

5

başlık dosyaları .c veya .cpp / .cxx dosyasında tanımladığınız işlevler için prototipler içerir (c veya c ++ kullanmanıza bağlı olarak). .H kodunuzun etrafına # ifndef / # tanımları yerleştirmek istersiniz, böylece aynı .h'yi programlarınızın farklı bölümlerine iki kez eklerseniz, prototipler yalnızca bir kez eklenir.

client.h

#ifndef CLIENT_H
#define CLIENT_H

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


#endif /** CLIENT_H */

Ardından, .h dosyasını aşağıdaki gibi bir .c dosyasına uygularsınız:

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

"böylece aynı .h'yi programlarınızın farklı bölümlerine iki kez eklerseniz, prototipler yalnızca bir kez eklenir." Bu yanıltıcı. Aynı başlık dosyasını aynı kaynak dosyadan iki kez eklemeye karşı koruma sağlarlar (iki farklı kaynak dosyasında iki başlık dahil olmak üzere tamamdır ve genellikle gereklidir!) Ve işlev prototiplerini yeniden bildirmek sorun değildir, türleri ve genel değişkenleri yeniden tanımlar neye karşı korunulması gerektiğidir.
Jonathan Wakely
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.