Nội dung chính
1. Thêm file vào dự án của bạn
Khi các chương trình lớn hơn, thông thường người ta chia chúng thành nhiều file cho các mục đích tổ chức hoặc tái sử dụng. Một lợi thế khi làm việc với IDE là chúng giúp làm việc với nhiều file dễ dàng hơn nhiều. Bạn đã biết cách tạo và biên dịch các dự án một file. Thêm file mới vào các dự án hiện có rất dễ dàng.
2. Đối với người dùng Visual Studio
Trong Visual Studio, nhấp chuột phải vào thư mục Source Files trong cửa sổ Solution Explorer và chọn Add> New Item….
Đảm bảo rằng bạn đã chọn File C ++ (.cpp). Đặt tên cho file mới và nó sẽ được thêm vào dự án của bạn.
Lưu ý: Nếu bạn tạo file mới từ menu File thay vì từ dự án của mình trong Solution Explorer, file mới sẽ không tự động được thêm vào dự án của bạn. Bạn sẽ phải thêm nó vào dự án theo cách thủ công. Để làm như vậy, hãy bấm chuột phải vào Source Files trong Solution Explorer, chọn Add> Existing Item, rồi chọn file của bạn.
Bây giờ khi bạn biên dịch chương trình của mình, bạn sẽ thấy trình biên dịch liệt kê tên file của bạn khi nó biên dịch nó.
3. Một ví dụ về nhiều file
Trong bài học – Thứ tự Các khai báo và định nghĩa trong C++, chúng ta đã xem xét một chương trình một file sẽ không biên dịch:
#include <iostream>
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n';
return 0;
}
int add(int x, int y)
{
return x + y;
}
Khi trình biên dịch đến lệnh gọi hàm add ở dòng 5 của main, nó không biết add là gì, bởi vì chúng ta chưa xác định add cho đến dòng 9! Giải pháp của chúng ta cho việc này là sắp xếp lại thứ tự các hàm (đặt hàm add trước) hoặc sử dụng một khai báo chuyển tiếp cho add.
Bây giờ chúng ta hãy xem xét một chương trình nhiều file tương tự:
add.cpp:
int add(int x, int y)
{
return x + y;
}
main.cpp:
#include <iostream>
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n'; // compile error
return 0;
}
Trình biên dịch của bạn có thể quyết định biên dịch add.cpp hoặc main.cpp trước. Dù bằng cách nào, main.cpp sẽ không biên dịch được, gây ra lỗi trình biên dịch giống như ví dụ trước:
main.cpp(5) : error C3861: ‘add’: identifier not found
Lý do cũng hoàn toàn giống nhau: khi trình biên dịch đến dòng 5 của main.cpp, nó không biết hàm add là gì.
Hãy nhớ rằng, trình biên dịch sẽ biên dịch từng file riêng lẻ. Nó không biết về nội dung của các file code khác, hoặc nhớ bất cứ điều gì nó đã thấy từ các file code đã được biên dịch trước đó. Vì vậy, mặc dù trình biên dịch có thể đã xem định nghĩa của hàm add trước đó (nếu nó đã biên dịch add.cpp trước), nó không nhớ.
Khả năng hiển thị hạn chế và bộ nhớ ngắn này là có chủ ý, để các file có thể có các hàm hoặc biến có cùng tên mà không xung đột với nhau. Chúng ta sẽ khám phá một ví dụ về xung đột như vậy trong bài học tiếp theo.
Các tùy chọn của chúng ta cho giải pháp ở đây cũng giống như trước: đặt định nghĩa của hàm add trước hàm main, hoặc đáp ứng trình biên dịch với một khai báo chuyển tiếp. Trong trường hợp này, vì hàm add nằm trong một file khác, tùy chọn sắp xếp không phải là một tùy chọn tốt.
Giải pháp tốt hơn ở đây là sử dụng khai báo chuyển tiếp:
main.cpp (với khai báo chuyển tiếp):
#include <iostream>
int add(int x, int y); // needed so main.cpp knows that add() is a function declared elsewhere
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n';
return 0;
}
add.cpp (giữ nguyên):
int add(int x, int y)
{
return x + y;
}
Bây giờ, khi trình biên dịch đang biên dịch main.cpp, nó sẽ biết định danh của hàm add là gì và hài lòng. Trình liên kết sẽ kết nối lệnh gọi hàm để thêm trong main.cpp với định nghĩa của hàm thêm trong add.cpp.
Sử dụng phương pháp này, chúng ta có thể cấp cho file quyền truy cập vào các hàm nằm trong file khác.
Hãy thử biên dịch add.cpp và main.cpp với khai báo chuyển tiếp cho chính bạn. Nếu bạn gặp lỗi trình liên kết, hãy đảm bảo rằng bạn đã thêm add.cpp vào dòng biên dịch hoặc dự án của mình đúng cách.
4. Đã xảy ra lỗi!
Có rất nhiều thứ có thể xảy ra sai sót trong lần đầu tiên bạn cố gắng làm việc với nhiều file. Nếu bạn đã thử ví dụ trên và gặp lỗi, hãy kiểm tra như sau:
1. Nếu bạn gặp lỗi trình biên dịch về việc add không được định nghĩa trong main, có thể bạn đã quên khai báo chuyển tiếp cho hàm add trong main.cpp.
2. Nếu bạn gặp lỗi trình liên kết về việc thêm không được xác định, ví dụ:
unresolved external symbol “int __cdecl add(int,int)” (?add@@YAHHH@Z) referenced in function _main
main.cpp và add.cpp. Nếu bạn chỉ thấy main.cpp thì chắc chắn add.cpp sẽ không được biên dịch. Nếu đang sử dụng Visual Studio hoặc Code :: Blocks, bạn sẽ thấy add.cpp được liệt kê trong ngăn Solution Explorer / project ở phía bên trái của IDE. Nếu không, hãy nhấp chuột phải vào dự án của bạn và thêm file, sau đó thử biên dịch lại. Nếu bạn đang biên dịch trên dòng lệnh, đừng quên #inclide cả main.cpp và add.cpp trong lệnh biên dịch của bạn.
2b. … Có thể bạn đã thêm add.cpp vào sai dự án.
2c. … Có thể file được đặt thành không biên dịch hoặc liên kết. Kiểm tra thuộc tính file và đảm bảo file được cấu hình để được biên dịch / liên kết. Trong Code :: Blocks, biên dịch và liên kết là các hộp kiểm riêng biệt nên được chọn. Trong Visual Studio, có một tùy chọn “loại trừ khỏi bản dựng(exclude from build)” sẽ được đặt thành “không” hoặc để trống.
3. Không #include “add.cpp” trong main.cpp. Điều này sẽ khiến trình biên dịch chèn trực tiếp nội dung của add.cpp vào main.cpp thay vì coi chúng như các file riêng biệt.
5. Tóm lược
Khi trình biên dịch biên dịch một chương trình nhiều file, nó có thể biên dịch các file theo bất kỳ thứ tự nào.
Chúng ta sẽ bắt đầu làm việc với nhiều file khi chúng ta bắt đầu lập trình hướng đối tượng, vì vậy, bây giờ là thời điểm tốt nhất để đảm bảo bạn hiểu cách thêm và biên dịch nhiều dự án file.
Nhắc nhở: Bất cứ khi nào bạn tạo một file code (.cpp) mới, bạn sẽ cần thêm nó vào dự án của mình để nó được biên dịch.
Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.
Nguồn và Tài liệu tiếng anh tham khảo:
Tài liệu từ cafedev:
- Full series tự học C++ từ cơ bản tới nâng cao tại đây nha.
- Ebook về C++ tại đây.
- Các series tự học lập trình MIỄN PHÍ khác
- Nơi liên hệ hợp tác hoặc quảng cáo cùng Cafedevn tại đây.
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!