Bagikan melalui


Prototipe Fungsi

Deklarasi fungsi mendahului definisi fungsi dan menentukan nama, jenis pengembalian, kelas penyimpanan, dan atribut fungsi lainnya. Untuk menjadi prototipe, deklarasi fungsi juga harus menetapkan jenis dan pengidentifikasi untuk argumen fungsi.

Sintaksis

declaration:
declaration-specifiers attribute-seq Memilihinit-declarator-listMemilih;

/* attribute-seq opt khusus Microsoft */

declaration-specifiers:
storage-class-specifier declaration-specifiers Memilih
type-specifier declaration-specifiers Memilih
type-qualifier declaration-specifiers Memilih

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator = initializer

declarator:
pointer Memilihdirect-declarator

direct-declarator: /* Deklarator fungsi */
direct-declarator ( parameter-type-list ) /* Deklarator gaya baru */
direct-declarator ( identifier-list Memilih) /* Deklarator gaya usang */

Prototipe memiliki bentuk yang sama dengan definisi fungsi, kecuali bahwa itu dihentikan oleh titik koma segera setelah kurung tutup dan karenanya tidak memiliki isi. Dalam kedua kasus, jenis pengembalian harus setuju dengan jenis pengembalian yang ditentukan dalam definisi fungsi.

Prototipe fungsi memiliki penggunaan penting berikut:

  • Mereka menetapkan jenis pengembalian untuk fungsi yang mengembalikan jenis selain int. Meskipun fungsi yang mengembalikan int nilai tidak memerlukan prototipe, prototipe disarankan.

  • Tanpa prototipe lengkap, konversi standar dibuat, tetapi tidak ada upaya yang dilakukan untuk memeriksa jenis atau jumlah argumen dengan jumlah parameter.

  • Prototipe digunakan untuk menginisialisasi pointer ke fungsi sebelum fungsi tersebut ditentukan.

  • Daftar parameter digunakan untuk memeriksa bahwa argumen dalam panggilan fungsi cocok dengan parameter dalam definisi fungsi.

Jenis yang dikonversi dari setiap parameter menentukan interpretasi argumen yang dipanggil fungsi tempat pada tumpukan. Tipe tidak cocok antara argumen dan parameter dapat menyebabkan argumen pada tumpukan disalahartikan. Misalnya, pada komputer 16-bit, jika pointer 16-bit diteruskan sebagai argumen, maka dinyatakan sebagai long parameter, 32 bit pertama pada tumpukan ditafsirkan sebagai long parameter. Kesalahan ini membuat masalah tidak hanya dengan long parameter, tetapi dengan semua parameter berikutnya. Anda dapat mendeteksi kesalahan semacam ini dengan mendeklarasikan prototipe fungsi lengkap untuk semua fungsi.

Prototipe menetapkan atribut fungsi. Kemudian, panggilan fungsi yang mendahului definisi fungsi (atau yang terjadi di file sumber lain) dapat diperiksa untuk tipe argumen dan ketidakcocokan jenis pengembalian. Misalnya, jika Anda menentukan penentu static kelas penyimpanan dalam prototipe, Anda juga harus menentukan static kelas penyimpanan dalam definisi fungsi.

Deklarasi parameter lengkap (int a) dapat dicampur dengan deklarator abstrak (int) dalam deklarasi yang sama. Misalnya, deklarasi berikut adalah legal:

int add( int a, int );

Prototipe dapat mencakup jenis, dan pengidentifikasi untuk, setiap ekspresi yang diteruskan sebagai argumen. Namun, pengidentifikasi tersebut hanya berada dalam cakupan hingga akhir deklarasi. Prototipe juga dapat mencerminkan fakta bahwa jumlah argumen bervariasi, atau bahwa tidak ada argumen yang diteruskan. Tanpa daftar seperti itu, ketidakcocokan mungkin tidak terungkap, sehingga pengkompilasi tidak dapat menghasilkan pesan diagnostik mengenainya. Untuk informasi selengkapnya tentang pemeriksaan jenis, lihat Argumen.

Cakupan prototipe di pengkompilasi Microsoft C sekarang sesuai dengan ANSI saat mengkompilasi dengan /Za opsi pengkompilasi. Jika Anda mendeklarasikan struct tag atau union dalam prototipe, tag dimasukkan pada cakupan tersebut daripada di cakupan global. Misalnya, saat mengkompilasi dengan /Za untuk kesesuaian ANSI, Anda tidak pernah dapat memanggil fungsi ini tanpa mendapatkan kesalahan ketidakcocokan jenis:

void func1( struct S * );

Untuk memperbaiki kode Anda, tentukan atau deklarasikan struct atau union pada cakupan global sebelum prototipe fungsi:

struct S;
void func1( struct S * );

Di bawah /Ze, tag masih dimasukkan di cakupan global.

Lihat juga

Fungsi