CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này thảo luận ngắn gọn về chức năng và cách sử dụng của #ifndef, #define, và #endif. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.
Sự cố: "ifndef/define/endif" chủ yếu nhằm mục đích ngăn chặn việc đưa vào và biên dịch lặp lại các tệp tiêu đề.
====================================================== ====== 。
cách sử dụng:
Tệp .h, như sau: #ifndef XX_H #define XX_H ... #endif.
Bằng cách này, nếu tệp tiêu đề này được đưa vào hai vị trí thì nó sẽ không được đưa vào hai lần. .
Vì XX_H đã được xác định trong lần đưa vào thứ hai nên nó không còn được bao gồm nữa----------------------------------- - -------------------------.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#ifndef GRAPHICS_H // Ngăn không cho đồ họa.h được tham chiếu nhiều lần
#define ĐỒ HỌA_H
#bao gồm <
toán.h
> //Tham khảo file header của thư viện chuẩn
…
#include “myheader.h” // Tệp tiêu đề tham chiếu của các thư viện không chuẩn
…
void Function1(…); // Khai báo hàm toàn cục
…
hộp lớp // Khai báo cấu trúc lớp
{
…
};
#kết thúc nếu
|
-------------------------------------------------- --- 。
Điều đó có nghĩa là khi bạn tạo nhiều tệp, nhiều tệp sẽ chứa tệp tiêu đề này--------------------------------- -- ---------------------.
Hãy để tôi cho bạn một ví dụ và phân tích nó bằng cách này:
Giả sử có 4 tệp trong dự án của bạn, đó là a.cpp, bh, ch, dh.
Phần đầu của a.cpp là: #include "bh " #include "ch " .
Tiêu đề của bh và ch là: #include "dh ".
Có một định nghĩa về lớp D trong dh.
Bằng cách này, .
Khi trình biên dịch biên dịch a.cpp, đầu tiên nó biên dịch bh theo #include "bh", sau đó biên dịch tệp dh theo #include "dh" trong bh. Theo cách này, lớp D trong dh ;
Sau đó biên dịch ch theo câu thứ hai của a.cpp #include "ch", và cuối cùng bạn sẽ tìm thấy lớp D trong dh, nhưng lớp D đã được biên dịch trước đó nên sẽ báo lỗi xác định lại.
Việc thêm ifndef/define/endif có thể ngăn chặn lỗi xác định lại này. -------------------------------------------------- -------------------------------------------------- .
1. Ví dụ: nếu bạn có hai tệp C, cả hai tệp C đều có cùng một tệp tiêu đề. Khi biên dịch, 2 file C này cần phải biên dịch lại với nhau thành 1 file thực thi nên phát sinh vấn đề, số lượng lớn khai báo xung đột. Tốt hơn nên đặt nội dung của tệp tiêu đề vào #ifndef và #endif.
Bất kể tệp tiêu đề của bạn có được nhiều tệp tham chiếu hay không, bạn phải thêm tệp này.
Định dạng chung là thế này:
#ifndef #define ...... ...... #endif .
Về lý thuyết, nó có thể được đặt tên tự do, nhưng "nhận dạng" của mỗi tệp tiêu đề phải là duy nhất. Quy tắc đặt tên của logo nói chung là tên file tiêu đề toàn chữ in hoa, có dấu gạch dưới trước và sau, dấu "." trong tên file cũng được đổi thành gạch chân, chẳng hạn như: stdio.h.
?
1
2
3
4
|
#ifndef _STDIO_H_
#xác định _STDIO_H_
......
#kết thúc nếu
|
2. Vấn đề khi định nghĩa biến trong #ifndef (thường không được định nghĩa trong #ifndef).
#ifndef AAA #định nghĩa AAA ... int i; ... #kết thúc nếu 。
Có một định nghĩa biến trong đó và khi liên kết trong vc, xảy ra lỗi định nghĩa lặp lại của i, nhưng nó được biên dịch thành công trong c.
lý do:
(1). Khi bạn lần đầu tiên sử dụng tệp .cpp của tiêu đề này để tạo .obj, int i được xác định trong đó. Khi một .cpp khác sử dụng tiêu đề này tạo lại .obj [riêng], int i được xác định lại. kết nối hai objs với nhau bằng một .cpp khác cũng bao gồm tiêu đề này và sẽ có các định nghĩa trùng lặp.
(2). Sau khi đổi đuôi file chương trình nguồn thành .c, VC sẽ biên dịch chương trình nguồn theo cú pháp của ngôn ngữ C thay vì C++. Trong ngôn ngữ C, nếu gặp nhiều int i, một trong số chúng sẽ tự động được coi là định nghĩa và những cái còn lại là khai báo.
(3). Kết quả kết nối của ngôn ngữ C và ngôn ngữ C++ là khác nhau. Có thể (đoán) rằng trong quá trình biên dịch, ngôn ngữ C++ mặc định các biến toàn cục thành ký hiệu mạnh nên xảy ra lỗi kết nối. Ngôn ngữ C xác định xem nó mạnh hay yếu dựa trên việc nó được khởi tạo hay không.
Giải pháp tham khảo:
(1).Thay đổi phần mở rộng của tệp chương trình nguồn thành .c.
(2). Giải pháp đề xuất: Chỉ khai báo extern int i trong .h,
Được xác định trong .cpp.
#ifndef __X_H__ #define __X_H__ extern int i; #endif //__X_H__ int i; Lưu ý: Các biến thường không được xác định trong tệp .h.
Trên đây là nội dung thảo luận ngắn gọn đầy đủ về chức năng và cách sử dụng của #ifndef, #define, #endif do editor mang đến cho các bạn. Mong các bạn ủng hộ nhé~.
Cuối cùng, bài viết này về vai trò và cách sử dụng #ifndef, #define và #endif kết thúc tại đây. Nếu bạn muốn biết thêm về vai trò và cách sử dụng của #ifndef, #define và #endif, vui lòng Tìm kiếm các bài viết về CFSDN hoặc. tiếp tục duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!