cuốn sách gpt4 ai đã làm

c++ - Tại sao tệp tiêu đề Head1.h không thể chứa tệp tiêu đề Head2.h chứa Head1.h?

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 16:08:37 28 4
mua khóa gpt4 Nike

Ví dụ: tôi muốn hai tệp tiêu đề có thể phụ thuộc vào các chức năng trong tệp tiêu đề khác.

//tập tin Header1.h
#include Header2.h
khoảng trống h1(){
//...
func1();
}
khoảng trống h2();

//tập tin Header2.h
#include Header1.h
void func1();
void func2(){
// một số mã khác...
h2();
}

Điều này có vẻ không phải là vấn đề lớn, nhưng đôi khi tôi cần sự phụ thuộc này để làm cho một số tệp trở nên mạch lạc một cách hợp lý. Tôi đã gặp vấn đề này nhiều lần trong Visual Studio khi biên dịch mã C++. Nhưng điều này không bao giờ được biên dịch, ngay cả khi tôi bao gồm các bộ bảo vệ tiêu đề riêng lẻ cho mỗi tệp, tức là.

#ifndef HEADER1_H
#xác định HEADER1_H
//Tiêu đề1.h...
#endif

Tại sao điều này không được phép? Hoặc có cách nào để biên dịch nó để nó hoạt động không?

câu trả lời hay nhất

Đầu tiên,#bao gồm 是一个bộ tiền xử lý Hướng dẫn chuyển đổi file văn bảnthay thế toàn văn vào một tập tin văn bản khác. hai lần thử #bao gồm Tệp tiêu đề tạo thành một vòng lặp thay thế văn bản lồng nhau vô hạn. Tôi nghĩ rõ ràng là một vòng lặp thay thế văn bản vô hạn không "hoạt động" chỉ vì nókhông giới hạn.

Thứ hai, trong việc sử dụng tệp tiêu đề#ifndef bao gồm các vệ sĩ sẽ đơn giản phá vỡ vòng lặp vô hạn tại một số điểm. tức là. Vòng lặp chứa sẽ trở thànhđặt hàngĐể bao gồm, trước tiên hãy bao gồm một tệp, sau đó bao gồm một tệp khác. Nhưng việc bao gồm tuần tự (theo bất kỳ thứ tự nào) sẽ không giúp giải quyết bất kỳ chu kỳ nào có trong tệp tiêu đềKhai báo sự phụ thuộc.

Vì vậy, cho dù bạn có sử dụng các bộ bảo vệ hay không, việc bao gồm các tệp tiêu đề theo vòng tròn sẽ không có ý nghĩa gì (ngoại trừ trong các bối cảnh rất đặc biệt như các thủ thuật tiền xử lý). Vòng lặp liên quan đến việc không bao giờ đạt được bất cứ điều gì. Bạn phải thiết kế các tệp tiêu đề của mình để chúng thậm chí không cố gắng dựa vào các phần bao gồm vòng tròn. tức là. Bạn phải xếp lớp các khai báo và tệp tiêu đề của mình thành các tệp cấp thấp hơn và cấp cao hơn, đồng thời luôn bao gồm cấp thấp hơn vào cấp cao hơn (không phải cách khác) và sử dụng các tiêu đề Thêm phụ thuộc trước đó vào khai báo để giải quyết bất kỳ vòng lặp nào .

Đôi khi các tệp tiêu đề yêu cầu đưa vào vòng lặp đơn giản vì chúng được thiết kế kém. Ví dụ: ngay cả khi không có sự phụ thuộc vòng tròn giữa các phần khai báo, các phần khai báo có thể được phân phối không chính xác giữa các tệp tiêu đề, dẫn đến nhu cầu được nhận thấy là phải đưa các tệp tiêu đề vào nhau theo chu kỳ. Trong trường hợp này, bạn nên cấu trúc lại tiêu đề của mình để loại bỏ mọi phụ thuộc khai báo vòng tròn. Ví dụ. Phân phối lại các khai báo giữa các tiêu đề, trích xuất các phần của hai tiêu đề phụ thuộc lẫn nhau sang tiêu đề cấp thấp thứ ba, v.v. Chỉ khi không thể tái cấu trúc kiểu này, tức là bạn có một khai báo vòng tròn thực sự về các phần phụ thuộc, hãy sử dụng khai báo chuyển tiếp như là phương sách cuối cùng.

Giới thiệu về c++ - Tại sao tệp tiêu đề Head1.h không thể chứa tệp tiêu đề Head2.h chứa Head1.h? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/31330609/

28 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress