1.2.2 Bắt đầu với chương trình đầu tiên của bạn (2)

Chú ý với ký tự # ở ngay dòng đầu tiên. Nó có nghĩa rằng nội dung của dòng này là cái gọi là chỉ thị tiền xử lý (preprocessor directive). Chúng tôi sẽ nói rõ hơn về preprocessor sau, lúc này chúng tôi chỉ có thể nói rằng đó là một một phần riêng biệt của compiler mà nhiệm vụ của nó là đọc trước nội dụng của chương trình và thực hiện một số thay đổi trong đó. Tiền tố “pre” gợi ý rằng các hoạt động đó được thực hiện trước khi quá trình biên dịch đầy đủ được diễn ra.

Những sự thay đổi mà preprocessor đưa ra thì phụ thuộc vào chỉ thị của nó. Chương trình của chúng ta đang sử dụng chỉ thị include. Khi preprocessor gặp chỉ thị này, nó sẽ thay thế chỉ thị này bằng nội dung của file mà tên của nó được đưa ra trong chỉ thị (trong trường hợp của chúng ta, tên file là iostream). Thay đổi được thực hiện bởi preprocessor không bao giờ làm biến đổi source file của bạn. Tất cả mọi sự thay đổi đều được thực hiện trên bản copy tạm thời của chương trình, và nó sẽ biến mất ngay khi compiler hoàn thành công việc của nó.

Vậy tại sao lại cần preprocessor để chèn vào một nội dung của một file chưa biết có tên là iostream ? Viết một chương trình cũng giống như xây dựng một công trình với các khối (block) đã được làm sẵn. Trong chương trình của chúng ta, chúng ta sẽ sử dụng một block như vậy và điều đó xảy ra khi chúng ta muốn viết một cái gì đó lên màn hình. Block đó được gọi là cout, nhưng trình biên dịch không hề biết gì về nó cho đến lúc này. Đặc biệt, compiler không nghĩ rằng cout là một cái tên hợp lệ cho một block. Compiler cần phải được thông báo về nó.

Một tập hợp các thông tin sơ bộ mà compiler cần sẽ được đưa và trong header files. Những file này chứa một tập hợp về các thông tin sơ bộ mà một block chế tạo sẵn có thể được sử dụng bởi chương trình để viết text lên màn hình, hoặc đọc ký tự được nhập từ bàn phím. Vì vậy, khi chương trình của chúng ta muốn viết cái gì đó, nó sẽ sử dụng một block gọi là cout, block này có thể làm được việc đó (và nhiều hơn thế nữa). Chúng ta không muốn làm compiler ngạc nhiên, vậy thì cần phải thông báo cho compiler về block đó. Các nhà phát triển của compiler đặt những thông tin này trong file iostream, và điều chúng ta cần làm là sử dụng file đó. Đó chính xác là những gì chúng ta mong đợi từ chỉ thị include.

Nhưng vậy thì file iostream được đặt ở đây vậy nhỉ ? Câu trả lời rất đơn giản, nhưng có thể không rõ ràng như bạn muốn: đó không phải việc của chúng ta. Preprocessor biết nó ở đâu.

Làm tốt lắm, preprocessor 😀 !