Các chỉ thị biên dịch có điều kiện #if, #ifdef, #ifndef

Một phần của tài liệu Giáo án - Bài giảng: TÀI LIỆU C++ - CHƯƠNG 4: HÀM VÀ CHƯƠNG TRÌNH (Trang 56 - 58)

IV. TỔ CHỨC CHƯƠNG TRÌNH 1 Các loại biến và phạm

3. Các chỉ thị biên dịch có điều kiện #if, #ifdef, #ifndef

• Chỉ thị:

#if dãy lệnh … #endif

#if dãy lệnh … #else dãy lệnh … #endif,

Các chỉ thị này giống như câu lệnh if, mục đích của nó là báo cho chương trình dịch biết đoạn lệnh giữa #if (điều kiện ) và #endif chỉ được dịch nếu điều kiện đúng. Ví dụ: const int M = 1; void main() { int i = 5; #if M==1 cout << i ; #endif } hoặc: const int M = 10; void main() { int i = 5; #if M > 8 cout << i+i ; #else cout << i*i ; #endif } • Chỉ thị #ifdef và #ifndef

Chỉ thị này báo cho chương trình dịch biết đoạn lệnh có được dịch hay không khi một tên gọi đã được định nghĩa hay chưa. #ifdef được hiểu là nếu tên đã được định nghĩa thì dịch, còn #ifndef được hiểu là nếu tên chưa được định nghĩa thì dịch. Để định nghĩa một tên gọi ta dùng chỉ thị #define tên.

viện có thể được chèn nhiều lần trong văn bản do vậy nó có thể sẽ được dịch nhiều lần, điều này sẽ gây ra lỗi vì các biến được khai báo nhiều lần. Để tránh việc này, ta cần sử dụng chỉ thị trên như ví dụ minh hoạ sau: Giả sử ta đã viết sẵn 2 tệp thư viện là mylib.h và mathfunc.h, trong đó mylib.h chứa hàm max(a,b) tìm số lớn nhất giữa 2 số, mathfunc.h chứa hàm max(a,b,c) tìm số lớn nhất giữa 3 số thông qua sử dụng hàm max(a,b). Do vậy mathfunc.h phải có chỉ thị #include mylib.h để sử dụng được hàm max(a,b).

− Thư viện 1. tên tệp: MYLIB.H int max(int a, int b)

{

return (a>b? a: b); }

− Thư viện 2. tên tệp: MATHFUNC.H #include "mylib.h"

int max(int a, int b) {

return (a>b? a: b); }

Hàm main của chúng ta nhập 3 số, in ra max của từng cặp số và max của cả 3 số. Chương trình cần phải sử dụng cả 2 thư viện.

#include "mylib.h" #include "mathfunc.h" main()

{

int a, b, c;

cout << "a, b, c = " ; cin >> a >> b >> c;

cout << max(a,b) << max(b,c) << max(a,c) << max(a,b,c) ; }

Trước khi dịch chương trình, bộ tiền xử lý sẽ chèn các thư viện vào trong tệp chính (chứa main()) trong đó mylib.h được chèn vào 2 lần (một lần của tệp chính và một lần của mathfunc.h), do vậy khi dịch chương trình, C++ sẽ báo lỗi (do hàm int max(inta, int b) được khai báo hai lần). Để khắc phục tình trạng này trong mylib.h ta thêm chỉ thị mới như sau:

// tệp mylib.h

#ifndef _MYLIB_ // nếu chưa định nghĩa tên gọi _MYLIB_

#define _MYLIB_ // thì định nghĩa nó int max(int a, int b) // và các hàm khác {

return (a>b? a: b); }

#endif

Như vậy khi chương trình dịch xử lý mylib.h lần đầu do _MYLIB_ chưa định nghĩa nên máy sẽ định nghĩa từ này, và dịch đoạn chương trình tiếp theo cho đến #endif. Lần thứ hai khi gặp lại đoạn lệnh này do _MYLIB_ đã được định nghĩa nên chương trình bỏ qua đoạn lệnh này không dịch.

Để cẩn thận trong cả mathfunc.h ta cũng sử dụng cú pháp này, vì có thể trong một chương trình khác mathfunc.h lại được sử dụng nhiều lần.

Một phần của tài liệu Giáo án - Bài giảng: TÀI LIỆU C++ - CHƯƠNG 4: HÀM VÀ CHƯƠNG TRÌNH (Trang 56 - 58)

Tải bản đầy đủ (DOC)

(63 trang)
w