01/10/2018, 11:21

Compiler trong C?

Mọi người cho em hỏi , em đang có thắc mắc:
thứ nhất :khi mình viết một file .c thì khi compile thì compiler nó sẽ tự động tìm đến file .h để biên dịch file .c thành .o phải không ạ ?
Thứ hai : giả sử em tải một lib khác mà trong đó có chứa những file .h em cần thì khi biên dịch compiler có tự động biết mà tìm ra file lib vừa tải không ?

lahata viết 13:36 ngày 01/10/2018
  1. Mình không hiểu câu hỏi lắm, file .h được sử lý trước khi compile. Compiler chỉ việc “bê” nguyên file .h để vào file .c
  2. Không hiểu rõ câu hỏi luôn. Nhưng, khi sử dụng thư viện thì mình cần chỉ cho compiler biết thử viện đó là gì, ở đâu chứ nó không tự động tìm ra file lib của bạn.
Lê Tuấn Anh viết 13:22 ngày 01/10/2018

Cái này trong mấy video giới thiệu về C của a Đạt cũng có nói qua rồi đó.

Tham khảo thêm cái này xem, của C++ nhưng cũng tương tự C thôi.

Learn C++ – 28 May 07

0.4 — Introduction to development

Before we can write and execute our first program, we need to understand in more detail how C++ programs get developed. Here is a graphic outlining a simplistic approach: Step 1: Define the problem…


Learn C++ – 3 Jun 07

1.9 — Header files

Headers, and their purpose As programs grow larger and larger (and include more files), it becomes increasingly tedious to have to forward declare every function you want to use that lives in a dif…

Student X viết 13:34 ngày 01/10/2018
  1. Người ta không bê nguyên file .h vào đâu bạn nhé!
Student X viết 13:28 ngày 01/10/2018

Giả sử bạn có 3 file: file1.c file2.h file2.c, trong đó file1.c và file2.c include file2.h và file2.c là triển khai hàm của file2.h (file2.h chỉ chứa prototype). khi build bạn sẽ build file1.c và file2.c. n sẽ tự tìm đến file2.h. cơ mà mình nghĩ là bạn nên tách riêng ra. đừng để n tự động tìm file.o như thế. bạn có thể tìm hiểu makefile để hiểu rõ hơn.

lahata viết 13:26 ngày 01/10/2018
  1. Người ta không bê nguyên file .h vào đâu bạn nhé!

Đây là bước preprocessor đó bạn.

In C and C++, the #include preprocessor directive causes the compiler to replace that line with the entire text of the contents of the named source file

Student X viết 13:32 ngày 01/10/2018

Em đang hiểu bác triển khai hàm trong file .h? liệu có đúng k ạ?

lahata viết 13:37 ngày 01/10/2018

Nếu khai triển hàm trong file .h thì hàm đó được compiler ngay trong file include file đó luôn.
Tiển xử lý #include sẽ thêm nội dung file .h vào file mà bác gọi include sau đó mới tiến hành biên dịch ra file object. Lúc biên dịch chỉ cần prototype của hàm, nên có khai triển hàm trong file .h hay không thì nó vẫn theo quy tắc đó.

Student X viết 13:23 ngày 01/10/2018

nếu bác khai triển hàm trong file .h thì bản chất của n chỉ là 1 file .c. chỉ là được chia nhỏ ra nhiều file mà thôi. (include là copy nguyên nội dung file include vào trong file được include và sẽ được compile lại tất cả). nếu khai triển hàm bên ngoài file .h khi bác buil tạo ra các file.o thì chúng ta có những file object này. khi chúng ta cần thay đổi một file nào đó. chúng ta chỉ cần build lại file để tạo ra file .o tương ứng. k cần buil lại cả project. rồi link các file .o này lại để build lại chương trình. vậy theo bác có sự khác nhau không?

lahata viết 13:24 ngày 01/10/2018

nếu bác khai triển hàm trong file .h thì bản chất của n chỉ là 1 file .c.

Bản chât không giống

file1.h

#ifndef FILE1_H
#define FILE1_H
// định nghĩa file h ở đây.
#endif /* FILE1_H */

Ta có thể include cả file source mà (?)

Mình chỉ muỗn bàn luận xem #include có bê nguyên code để vào đó hay không.

viết 13:28 ngày 01/10/2018

nó giống như con trỏ ấy, hàm này chứa con trỏ tới mảng X chứ ko chứa mảng X. Mảng X có thể được nhiều con trỏ trỏ tới, nhưng chỉ có 1 mảng X.

file .h chứa khai bao/chữ ký của hàm: hàm này có tên là gì, nhận vào các biến gì, trả về kiểu gì, nhưng ko cần biết hàm này làm gì và làm như thế nào. Phần “làm như thế nào” là ở file .c. Phần chữ ký hàm giống như con trỏ, phần làm ntn là mảng thực sự. Khi biên dịch ra file .o chưa cần tới cái mảng thực sự, giống như là tôi sẽ làm cái hàm này, ko biết nó làm gì như tôi sẽ làm. Tới khi liên kết lại thành file thực thi .exe hay thư viện .lib .dll .so thì mới cần biết hàm đó làm gì, ở đâu để khi chạy chương trình thì mới gọi cái hàm đó

để 1 hàm có thể gọi ở nhiều file .c thì khi biên dịch ta chỉ cần con trỏ/chữ ký của hàm đó, chưa cần biết nó làm gì nên ta include chữ ký ở file .h được rồi. Chuyện nó ở đâu và làm gì thì anh liên kết quyết định khi liên kết các file .o lại thành .exe

Student X viết 13:21 ngày 01/10/2018

con trỏ ạ??? :)))

Bài liên quan
0