1. # include
Chỉ thị include được sử dụng để chèn một file vào chương trình nguồn của bạn
Cú pháp của lệnh:
#include <Tên_file>
hoặc
#include “Tên_file”
Nếu tên file đặt trong cặp dấu lớn hơn (<) và nhỏ hơn (>) chỉ rằng file chèn là một phần của thư viện tiêu chuẩn. Chương trình biên dịch đầu tiên sẽ tìm file trong thư viện ở thư mục cài đặt. Nếu tên file được đặt trong cặp dấu nháy kép(” “), khi đó đầu tiên chương trình biên dịch sẽ tìm trong thư mục chứa file C đang được biên dịch, nếu không có sẽ tìm trong thư viện ở thư mục cài đặt.
Ví dụ:
#include <16F877.H> // chương trình sử dụng cho VĐK 16F877
#include “usb_desc_hid_user.h”
#include < C:INCLUDESCOMLIBMYRS232.C > // chỉ đường dẫn đến file cần chèn vào
Bạn có thể nhận thấy rằng các chỉ thị #include không có dấu chấm phẩy ở cuối câu. Lý do là các chỉ thị #include không phải là một câu lệnh trong C, nhưng thay vào đó là một chỉ thị tiền xử lý cho trình biên dịch. Toàn bộ các tập tin include được chèn vào file nguồn tại giai đoạn biên dịch
2. #Define
Sử dụng để định nghĩa hằng, tên kiểu dữ liệu hoặc macro
Cú pháp
#define Tên_định_danh Thay_Thế
Khi các tiền xữ lý gặp chỉ thị này, nó sẽ thay thế tất cả các “Tên_định_danh” trong đoạn code của chương trình bằng “Thay_thế” , “Thay_thế“ này có thể là biểu thức, lệnh,hoặc bất cứ gì, bộ tiền xữ lý chỉ đơn giản là thay thế tất cả “Tên_định_danh” bằng “Thay_thế” tại những vị trí “Tên_định_danh” xuất hiện
Ví dụ:
|
Sau đó tiền xữ lý sẽ thay thế hết TABLE_SIZE
bằng 100. Đoạn mã ở dưới tương đương:
|
#define cũng có thể có tham số để định nghĩa một macro hàm.
#define min(X, Y) ((X) < (Y) ? (X) : (Y)) x = min(a, b); y = min(1, 2); z = min(a + 28, *p); |
Tương đương với
x = ((a) < (b) ? (a) : (b)) ; y = ((1) < (2) ? (1) : (2)) ; z = ((a + 28) < (*p) ? (a + 28) : (*p)) ; |
Macro được định nghĩa có giá trị đến khi gặp #undef , #undef được sử dụng để giới hạn khối định nghĩa macro.
|
Tương đương với
|
Chức năng định nghĩa macro chấp nhận hai toán tử đặc biệt (# và ##) trong chuỗi thay thế:
Nếu toán tử # được sử dụng trước khi một tham số được sử dụng trong chuỗi thay thế, thông số đó được thay thế bằng một chuỗi ký tự (được đặt trong cặp ngoặc kép)
|
Tương đương với
|
Các ví dụ thường dùng:
#define RA0 PIN_A0 output_high(RA0); |
Hoặc:
#define output_high(x) {x=1;} |
3. #ifdef, #ifndef, #if, #endif, #else và #elif
Những chỉ thị này cho phép chèn hoặc loại bỏ một phần đoạn code chương trình nếu thỏa mãn điều kiện
#ifdef cho phép một đoạn của chương trình được biên dịch chỉ khi nếu macro được chỉ định như là một tham số được xác định.
Ví dụ:
#ifdef TABLE_SIZE
int table[TABLE_SIZE]; #endif |
Trong trường hợp này đoạn code:int table[TABLE_SIZE]; chỉ biên dịch nếu TABLE_SIZE đã được định nghĩa trước với #define. Nếu nó không được định nghĩa, đoạn code sẽ không chèn trong khi chương trình biên dịch
#indef thì ngược lại: đoạn code giữa #ifndef và #endif chỉ được biên dịch nếu tên định danh chỉ định không được định nghĩa trước . Ví dụ
#ifndef TABLE_SIZE
#define TABLE_SIZE 100 #endif int table[TABLE_SIZE]; |
Nếu TABLE_SIZE chưa được định nghĩa trước với #define , thì nó được chỉ định với giá trị 100, còn nếu đã định nghĩa thì đoạn code trên được bỏ qua
Các chỉ thị #if, #else và #elif (tức là, “else if“) được dùng để chỉ định một số điều kiện để được đáp ứng để cho các phần của đoạn code xung quanh được biên soạn. Các điều kiện sau #if hoặc #elif chỉ có thể làbiểu thức hằng số, bao gồm cả biểu thức macro. Ví dụ:
#if TABLE_SIZE>200
#undef TABLE_SIZE #define TABLE_SIZE 200 #elif TABLE_SIZE<50 #undef TABLE_SIZE #define TABLE_SIZE 50 #else #undef TABLE_SIZE #define TABLE_SIZE 100 #endif int table[TABLE_SIZE]; |
Chú ý toàn bộ cấu trúc chỉ thị của #if, #elif và #else kết thúc với #endif.
Các chỉ thị #ifdef và #ifndef cũng có thể viết gọn bằng cách sử dụng các toán tử đặc biệt define và !definetương ứng trong bất kỳ chỉ thị #if hoặc #elif
#if defined ARRAY_SIZE
#define TABLE_SIZE ARRAY_SIZE #elif !defined BUFFER_SIZE #define TABLE_SIZE 128 #else #define TABLE_SIZE BUFFER_SIZE #endif |