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

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.