Ifndef là gì

  -  

bên cạnh các tự khoá thường dùng, C/C++ có một số lệnh tiền xử lí, phần nhiều lệnh này không khi nào được biên dịch thành bất kể dòng lệnh nào trong mã thực thi. Ráng vào đó nó có ảnh hưởng đến những khía cạnh của quy trình biên dịch. Ví dụ, ta hoàn toàn có thể dùng chỉ dẫn tiền xử lý để phòng trình biên dịch biên dịch một phần đoạn mã nào đó. Chỉ thị tiền cập nhật được phân biệt bởi cách ban đầu với vệt #. Chỉ thị tiền xử lý không phải là lệnh C/C++ bởi vì vậy không có dấu “;” lúc kết thúc. Nội dung bài viết này để giúp đỡ bạn nắm rõ hơn sự việc này.

Bạn đang xem: Ifndef là gì

Chỉ thị tiền giải pháp xử lý (preprocessor directives)

thông tư tiền giải pháp xử lý là rất nhiều chỉ thị cung cấp cho trình biên dịch để cách xử trí những thông tin trước khi bắt đầu quá trình biên dịch. Tất cả các thông tư tiền cách xử trí đều bắt đầu với với # và các chỉ thị chi phí xử lý không hẳn là lệnh C/C++ bởi vậy không có dấu ; khi kết thúc. Để đến dễ chúng ta chia thành 3 nhóm chủ yếu đó là:

Chỉ thị bao quát tệp (#include).Chỉ thị định nghĩa đến tên (#define macro).Chỉ thị biên dịch có điều kiện (#if, #else, #elif, #endif, …).
Chỉ thị bao quát tệp (#include)

Ở nhóm này chỉ tất cả một thông tư đó là #include.

Đây là thông tư cho phép chúng ta include một file khác vào file chúng ta đang viết.

Cú pháp 1:

#include

với cú pháp 1, bộ tiền cách xử trí sẽ tìm file_name có sẵn trong IDE(như Visual Studio) của doanh nghiệp và chèn vào tệp tin mà chúng ta đang viết, ví như tìm ko thấy file_name thì trình biên dịch đang báo lỗi. Những file gồm sẵn vào IDE như stdio.h, math.h, conio.h, ….

Ví dụ:

#include

Cú pháp 2:

#include “file_name”

Khi thực hiện cú pháp 2, bộ tiền xử trí sẽ tìm file_name trong các thư mục trên máy tính của bọn chúng ta, khi tìm không thấy thì liên tục tìm trong những file bao gồm sẵn vào IDE. Trường hợp tìm được file_name thì chèn file_name vào file đã thao tác, còn vẫn không tìm kiếm thấy file_name thì trình biên dịch vẫn báo lỗi.

Ví dụ:

#include “GPIO.h”

Để phát âm bạn hình dung rõ hơn về cơ chế buổi giao lưu của chỉ thị #include thì bạn theo dõi lấy một ví dụ sau đây.

Tôi có file GPIO.h có văn bản như sau:

struct PORT

int Pin;

boolean State;

;

Trong file main.cpp tôi mong muốn sử dụng struct PORT thì tôi phải #include “GPIO.h”.

//main.cpp

#include “GPIO.h”

int main()

struct PORT 1;

return 0;

Việc #include “GPIO.h” giống như việc chép toàn bộ các đoạn code trong file GPIO.h vào file main.cpp.

struct PORT

int Pin;

boolean State;

;

int main()

struct PORT 1;

return 0;

Chỉ thị định nghĩa mang lại tên (#define macro) 

Ở team này gồm những chỉ thị #define, #undef.

thông tư #define

Chỉ thị #define không có đối số.

Cú pháp:

#define identifier replacement-list

chỉ thị này có công dụng thay cụ tên (identifier) bằng một dãy kí tự sau nó, khi dãy kí tự thay thế quá dài với sang dòng bắt đầu thì rất có thể sử dụng dấu  vào cuối cái trước.

Ví dụ:

#define nethuerestaurant.com.vn “nethuerestaurant.com.vn” // định nghĩa cho nethuerestaurant.com.vn

trong hàm main ta thực hiện lệnh sau:

printf(nethuerestaurant.com.vn); // tương tự với lệnh printf(“nethuerestaurant.com.vn”);

Phạm vi của tên được định nghĩa bởi #define là dịp từ khi nó được định nghĩa cho tới cuối tệp.

rất có thể dùng #define định nghĩa như thương hiệu hàm, một biểu thức, một quãng chương trình bởi một tên, với cách sử dụng này thì lịch trình của họ sẽ gọn gàng và dễ nắm bắt hơn.

Ví dụ:

#define output đầu ra printf(“nethuerestaurant.com.vn”);

trong hàm main tôi triển khai câu lệnh sau:

output; // printf(“nethuerestaurant.com.vn”);

những điểm cần chú ý của chỉ thị #define cho cách áp dụng trên:

Khi định nghĩa một biểu thức ta nên được sắp xếp nó vào trong cặp lốt ngoặc tròn.

Ví dụ:

#define SUM 5+8

lúc ta gán size = SUM không xảy ra vấn đề gì dẫu vậy khi gán size = 5*SUM thì tương đương với size = 5*5+8 chứ không phải là size = 5*(5+8) như ta mong muốn muốn. Chính vì vậy nên ta dùng #define SUM(5+8)sẽ luôn luôn đúng trong đầy đủ trường hợp.

Khi tư tưởng đoạn chương trình với nhiều câu lệnh thì ta nên được sắp xếp trong cặp ngoặc  và .

Ví dụ:

#define HELLO printf(“Hello nethuerestaurant.com.vn ”); printf(“nethuerestaurant.com.vn”);

void main()

bool x = true;

if(x) HELLO;

Đoạn chương trình trên khi biên dịch vẫn theo như mong muốn của ta là khi x = true in ra màn hình:

Hello nethuerestaurant.com.vn

nethuerestaurant.com.vn

lúc gán x = false thì ko in ra màn hình.

Xem thêm: Dưới Đây Là Cách Sử Dụng Ứng Dụng Wallet Trên Iphone Là Gì, Set Up Apple Pay In Wallet On Iphone

mà lại khi ta bỏ ngoặc  và  thì đoạn code đã như sau:

#define HELLO printf(“Hello nethuerestaurant.com.vn ”); printf(“nethuerestaurant.com.vn”);

Thì trong cả khi x = false thì vẫn in ra màn hình:

nethuerestaurant.com.vn

Chỉ thị #define có đối số.

ngoài cách sử dụng #define như trên, bọn chúng ta còn rất có thể dùng #define để có mang các macro có đối giống hệt như hàm. Để rõ hơn nữa thì bạn quan sát và theo dõi ví dụ khái niệm một macro tính tổng của 2 giá trị.

#define SUM(x,y) (x)+(y)

lúc ấy câu lệnh

int z = SUM(x*2, y*3);

Được nỗ lực bằng

int z = (x*2) + (y*3);

các điểm buộc phải lưu ý:

Giữa macro và dấu ( không được tồn tại khoảng trắng.Để tránh rủi ro khủng hoảng không mong ước thì khi viết các biểu thức định nghĩa mang lại macro, những đối tượng bề ngoài (như x và y sinh sống ví dụ trên) thì nên cần có cặp ngoặc ( và ) bao quanh. Để minh họa cho điều này thì ta mang lại với lấy ví dụ như sau:

#define MUL(x,y) x*y

void main()

printf(“%d”, MUL(5+3, 10));

Khi kia trình biên dịch thay MUL(5+3, 10) bằng 5+3*10 và ta nhấn đáp án 35 thay vì 80 như ta ý muốn muốn.

Chỉ thị #undef

Cú pháp:

#undef identifier 

khi ta đề xuất định nghĩa lại một tên mà ta đã tư tưởng trước kia thì ta sử dụng #undef để hủy vứt định nghĩa đó với sử dụng #define định nghĩa lại mang lại tên đó.

Ví dụ:

#define nethuerestaurant.com.vn “Hello nethuerestaurant.com.vn ” // Định nghĩa mang lại tên nethuerestaurant.com.vn là “Hello nethuerestaurant.com.vn “

#undef nethuerestaurant.com.vn // Hủy vứt định nghĩa đến tên nethuerestaurant.com.vn

#define nethuerestaurant.com.vn “Welcome khổng lồ nethuerestaurant.com.vn ” // Định nghĩa lại đến tên nethuerestaurant.com.vn là “Welcome lớn nethuerestaurant.com.vn “

Chỉ thị biên dịch bao gồm điều kiện

Ở nhóm này gồm những chỉ thị #if, #elif, #else, #ifdef, #ifndef.

các chỉ thị #if, #elif, #else.

Cú pháp:

#if constant-expression_1

// Đoạn chương trình 1

#elif constant-expression_2

// Đoạn lịch trình 2

#else

//Đoạn chương trình 3

#endif

Nếu constant-expression_1 true thì chỉ có đoạn công tác 1 sẽ được biên dịch, trái lại nếu constant-expression_1 false thì sẽ liên tiếp kiểm ta đến constan-expression_2. Ví như vẫn chưa đúng thì đoạn chương trình trong chỉ thị #else được biên dịch .

Các constant-expression là biểu thức mà những toán hạng trong số đó đều là hằng, những tên đã làm được định nghĩa vì các #define cũng được coi là các hằng.

những chỉ thị #ifdef, #ifndef.

Một bí quyết biên dịch có đk khác chính là sử dụng #ifdef và #ifndef, được gọi như là Nếu sẽ định nghĩa và Nếu chưa được định nghĩa.

Chỉ thị #ifdef.

#ifdef identifier

//Đoạn chương trình 1

#else

//Đoạn công tác 2

#endif

Nếu indentifier đã được quan niệm thì đoạn công tác 1 sẽ được thực hiện. Ngược lại nếu indentifier chưa được khái niệm thì đoạn chương trình 2 sẽ được thực hiện.

chỉ thị #indef

#ifndef identifier

//Đoạn lịch trình 1

#else

//Đoạn công tác 2

#endif

với chỉ thị #ifndef thì phương pháp hoạt động ngược lại với #ifdef.

Ví dụ:

#ifdef MAX // giả dụ MAX đã có được định nghĩa

#undef MAX // Hủy bỏ MAX

#define MAX 100 // Định nghĩa lại MAX

#else // giả dụ MAX chưa được đinh nghĩa

#define MAX 1 // Định nghĩa MAX

#endif

các chỉ thị đk ở trên, thường được sử dụng cho vấn đề xử lý xung đột nhiên thư viện khi chúng ta #include nhiều thư viện như làm việc ví dụ dưới đây:

Tôi có một file A.h.

//file A.h

Source code B

Tôi cũng có các file B.h và C.h và 2 tệp tin này đều cần nội dung của file A.h, chính vì như vậy tôi #include “A.h” vào file B.h và C.h.

//file B.h

#include”A.h”

Source code B

//file C.h

#include”A.h”

Source code C

file main.cpp của tôi #include “B.h” và #include “C.h”, lúc ấy nội dụng file main.cpp trở thành.

//file main.cpp

#include”B.h”

#include”C.h”

Source code tệp tin main

chúng ta có thể hình dung file main.cpp như sau:

//file main.cpp

//#inlude”B.h”

Source code A

Source code B

//#include”C.h”

Source code A

Source code C

Source code file main

Như ta thấy văn bản file A.h sẽ được chép gấp đôi sang file main.cpp, cũng chính vì khi ta #include “B.h” thì văn bản file B.h(có cả ngôn từ file A.h) đã có được chép thanh lịch file main.cpp. Ta tiếp tục #include “C.h” thì văn bản file C.h (có cả câu chữ file A.h) đã làm được chép sang file main.cpp. Do thế, ngôn từ của file A.h được chép 2 lần trong file main.cpp và lúc ta biên dịch thì trình biên dịch vẫn báo lỗi. Để khắc phục và hạn chế lỗi này thì tôi áp dụng chỉ thị #ifndef, #define vào trong file A.h.

Xem thêm: Khách Sạn Đẹp Sapa Nhất Định Phải Đến, Các Khách Sạn Sang Trọng Ở Sa Pa

#ifndef __A_H__

#define __A_H__

Source code A

#endif // __AH__

khi đó nội dung file main.cpp chúng ta hoàn toàn có thể hình dung là:

//file main.cpp

//#include”B.h”

#ifndef __A_H__

#define __A_H__

Source code A

#endif // __AH__

Source code B

//#include”C.h”

#ifndef __A_H__

#define __A_H__

Source code A

#endif // __AH__

Source code C

Source code tệp tin main

cách thức hoạt động:

Từ mẫu 4-9: __A_H__ chưa được có mang nên chất nhận được chép nội dung file A.h vào main.cpp.Dòng 11: ngôn từ file B.h.Từ mẫu 14-19: Ở trên __A_H__ đã được định nghĩa yêu cầu không cho phép chép văn bản file A.h vào main.cpp.Dòng 21: ngôn từ file C.h.

Nguồn sưu tầm: Stdio