Saya memiliki dua file berikut ini:
file1.c
int main(){
foo();
return 0;
}
file2.c
void foo(){
}
Dapatkah saya mengkompilasi dan menautkan kedua file tersebut bersama-sama sehingga file1.c
akan mengenali fungsi foo
tanpa menambahkan extern
?
Memperbarui prototipe.
gcc file1.c file2.c throws: warning: deklarasi implisit fungsi foo.
Cara yang benar adalah sebagai berikut:
file1.c
#include <stdio.h>
#include "file2.h"
int main(void){
printf("%s:%s:%d \n", __FILE__, __FUNCTION__, __LINE__);
foo();
return 0;
}
file2.h
void foo(void);
file2.c
#include <stdio.h>
#include "file2.h"
void foo(void) {
printf("%s:%s:%d \n", __FILE__, __func__, __LINE__);
return;
}
keluaran
$
$ gcc file1.c file2.c -o file -Wall
$
$ ./file
file1.c:main:6
file2.c:foo:6
$
Anda tidak memerlukan extern
, tetapi file1.c harus melihat deklarasi bahwa foo()
itu ada. Biasanya deklarasi ini ada di file header.
Untuk menambahkan deklarasi forward tanpa menggunakan file header, cukup modifikasi file1.c menjadi:
int foo(); // add this declaration
int main(){
foo();
return 0;
}
Anda bisa, tetapi Anda tidak boleh melakukannya.
Gunakan berkas header, file2.h:
// file2.h
void foo(); // prototype for function foo()
Kemudian tambahkan:
#include "file2.h"
di file1.c
Untuk mengkompilasi:
$ gcc -Wall file1.c file2.c -o foo
Sebagai aturan umum, lebih baik (lebih kuat) menggunakan file header untuk mendefinisikan interface dari setiap modul daripada prototipe ad hoc di dalam modul-modul dependen. Ini kadang-kadang dikenal sebagai prinsip SPOT (Single Point Of Truth).