Tiền xử lý và Header

Tiền xử lý

Tiền xử lý là bước xử lý trước khi biên dịch mã nguồn. Tiền xử lý sẽ xử lý file mã nguồn và tạo ra file sau khi đã xử lý. Tất cả các tiền xử lý đều bắt nguồn bằng ký tự #.

Sau đây là mô tả các tiền xử lý quan trọng.

Tiền xử lý Mô tả
#include Thêm một file vào mã nguồn
#define Định nghĩa một macro
#undef Hủy định nghĩa của macro
#ifdef Nếu một macro đã định nghĩa
#ifndef Nếu một macro chưa định nghĩa
#if Điều kiện if
#else Nếu điều kiện if là false thì chạy else
#elif Viết tắt của else if
#endif Kết thúc của #if
#error In ra lỗi

Macro giống một hằng nhưng được thay thế thành giá trị ngay lúc biên dịch.

Header là các file đuôi .h chứa các khai báo của C để các file có thể dùng lại. Để include các file từ thư mục hệ thống chúng ta sử dụng:
#include <file>

Để include các file tự tạo trong thư mục của chúng ta thì sử dụng:
#include "file"

Xử lý

Khi dùng tiền xử lý #include thì nội dung của đoạn #include được thay thế bằng nội dung của file include.

Ví dụ nội dung file header.h:

1
2
3
// file header.h
char * string = "My string";
int a = 10;

Nội dung file main.c:

1
2
3
4
5
// file main.c
#include "header.h"
int main() {
  return 0;
}

Khi xử lý tiền biên dịch thì nội dung file main.c sẽ là

1
2
3
4
5
char * string = "My string";
int a = 10;
int main() {
  return 0;
}

Include một lần duy nhất

Trong chương trình, khi mà chúng ta muốn include nhiều lần một file header thì có thể bị lỗi. Để include duy nhất một file ta hãy xử dụng tiền xử lý #ifndef, #define#endif.

Ví dụ file header.h như trên chúng ta hãy viết lại như sau:

1
2
3
4
5
6
7
8
// file header.h
#ifndef HEADER_H
#define HEADER_H

char * string = "My string";
int a = 10;

#endif

Khai báo header và viết nội dung thực thi phần header

Ví dụ bạn muốn khai báo hàm trong header và viết phần thực thi trong file .c, hãy làm như sau:
File add.h

1
2
3
4
5
6
// file add.h
#ifndef FOO_H
#define FOO_H

int add(int a, int b);
#endif

File add.c

1
2
3
4
5
#include "add.h"

int add (int a, int b) {
  return a + b;
}

File main.c

1
2
3
4
5
6
7
#include <stdio.h>
#include "add.h"

int main() {
  printf("%d\n", add(1, 2)); // in 3
  return 0;
}

Biên dịch chương trình bằng gcc trên linux

gcc main.c add.c -o app