Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
İşlev bildirimi işlev tanımından önce gelip işlevin adını, dönüş türünü, depolama sınıfını ve diğer özniteliklerini belirtir. Prototip olmak için işlev bildiriminin işlevin bağımsız değişkenleri için türler ve tanımlayıcılar da oluşturması gerekir.
Sözdizimi
declaration
:
declaration-specifiers
attribute-seq
tercih et init-declarator-list
;
/* attribute-seq
opt Microsoft'a özgü */
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
Tercih
type-specifier
declaration-specifiers
Tercih
type-qualifier
declaration-specifiers
Tercih
init-declarator-list
:
init-declarator
init-declarator-list
,
init-declarator
init-declarator
:
declarator
declarator
=
initializer
declarator
:
pointer
Tercih direct-declarator
direct-declarator
: /* İşlev bildirimcisi */
direct-declarator
(
parameter-type-list
)
/* Yeni stil bildirimcisi */
direct-declarator
(
identifier-list
opt )
/* Eski stil bildirimci */
Prototip, işlev tanımıyla aynı biçime sahiptir, ancak kapanış parantezinin hemen ardından noktalı virgülle sonlandırılır ve bu nedenle gövdesi yoktur. Her iki durumda da, dönüş türünün işlev tanımında belirtilen dönüş türüyle aynı olması gerekir.
İşlev prototipleri aşağıdaki önemli kullanımlara sahiptir:
dışındaki
int
türleri döndüren işlevler için dönüş türünü oluştururlar. Değer döndürenint
işlevler prototip gerektirmese de prototipler önerilir.Tam prototipler olmadan standart dönüştürmeler yapılır, ancak parametre sayısıyla bağımsız değişkenlerin türünü veya sayısını denetleme girişiminde bulunulmamalıdır.
Prototipler, bu işlevler tanımlanmadan önce işlevlere yönelik işaretçileri başlatmak için kullanılır.
Parametre listesi, işlev çağrısındaki bağımsız değişkenlerin işlev tanımındaki parametrelerle eşleşerek eşleşmediğini denetlemek için kullanılır.
Her parametrenin dönüştürülen türü, işlev çağrısının yığına yerleştireceği bağımsız değişkenlerin yorumunu belirler. Bir bağımsız değişken ve parametre arasındaki tür uyuşmazlığı, yığındaki bağımsız değişkenlerin yanlış anlaşılmasına neden olabilir. Örneğin, 16 bit bir bilgisayarda, 16 bit işaretçi bağımsız değişken olarak geçirilirse ve parametre olarak long
bildirilirse, yığındaki ilk 32 bit parametre olarak long
yorumlanır. Bu hata yalnızca parametresiyle long
değil, sonraki tüm parametrelerle de sorun oluşturur. Tüm işlevler için eksiksiz işlev prototipleri bildirerek bu tür hataları algılayabilirsiniz.
Prototip bir işlevin özniteliklerini oluşturur. Ardından işlev tanımından önceki işlev çağrıları (veya diğer kaynak dosyalarda gerçekleşen) bağımsız değişken türü ve dönüş türü uyuşmazlıkları denetlenebilir. Örneğin, bir prototipte depolama sınıfı tanımlayıcısını static
belirtirseniz, işlev tanımında depolama sınıfını da belirtmeniz static
gerekir.
Tam parametre bildirimleri (int a
), aynı bildirimdeki soyut bildirimcilerle (int
) karıştırılabilir. Örneğin, aşağıdaki bildirim yasaldır:
int add( int a, int );
Prototip, bağımsız değişken olarak geçirilen her ifadenin türünü ve tanımlayıcısını içerebilir. Ancak, bu tür tanımlayıcılar yalnızca bildirimin sonuna kadar kapsam içindedir. Prototip, bağımsız değişken sayısının değişken olduğu veya hiçbir bağımsız değişkenin geçiril olmadığı gerçeğini de yansıtabilir. Böyle bir liste olmadan, uyuşmazlıklar ortaya çıkarılamayabilir, bu nedenle derleyici bunlarla ilgili tanılama iletileri oluşturamaz. Tür denetimi hakkında daha fazla bilgi için bkz . Bağımsız değişkenler.
Microsoft C derleyicisindeki prototip kapsamı artık derleyici seçeneğiyle derlenirken ANSI uyumluluğuna sahip /Za
. Bir prototip içinde veya union
etiketi bildirirsenizstruct
, etiket genel kapsamda değil bu kapsama girilir. Örneğin, ANSI uyumluluğu için ile /Za
derleme yaparken, tür uyuşmazlığı hatası almadan bu işlevi hiçbir zaman çağıramayın:
void func1( struct S * );
Kodunuzu düzeltmek için, işlev prototipi struct
öncesinde veya union
genel kapsamında öğesini tanımlayın veya bildirin:
struct S;
void func1( struct S * );
altında /Ze
, etiketi yine de genel kapsamda girilir.