[Học lập trình C++] Chương 1: 1.8 – Lập trình với nhiều file

1.8 – Lập trình với nhiều file
Khi chương trình càng lớn lên, không lạ lùng gì khi chia nó thành nhiều file khác nhau cho mục đích tổ chức. Một ưu điểm của làm việc với IDE là chúng làm việc với nhiều file một cách dễ dàng. Bạn đã biết rằng làm thế nào để tạo và biên dịch một project đơn file. Thêm file mới vào một project đã tồn tại thì rất dễ dàng.
Thêm file mới vào project trong Visual Studio
Trong Visual Studio 2005 Express, phải chuột vào Source file trong Solution Explorer window bên tay trái, và chọn Add -> New Item. Chắc chắn bạn có “C++file (.cpp)” được chọn. Đưa một tên file mới, và nó sẽ được thêm vào project của bạn.
Lưu ý: Nếu bạn tạo một file mới từ File menu thay vì từ project của bạn trong Solution Explorer, file mới sẽ không được thêm tự động vào project. Bạn sẽ phải add vào project một cách thủ công. Để làm điều này, phải chuột vào “Source Files” trong Solution Explorer, chọn Add -> Existing Item, và sau đó chọn file của bạn.
Khi bạn biên dịch của bạn, file mới sẽ tự động được thêm vào, bởi vì nó là một phần project của bạn.
Thêm files vào project trong Code::Blocks
Trong Code::Blocsks, chọn file menu và chọn new file. Nhập tên file mới vào và đừng quên đuôi cpp, và Code::Blocks sẽ hỏi bạn là bạn có muốn thêm nó vào project active hay không. Click “Yes”. Chú ý rằng bạn sẽ phải click vào “Release” và “Debug”, để chắc chắn là có cả hai phiên bản.
Nếu Code::Blocks không yêu cầu bạn có muốn thêm file vào project active, hoặc nếu file không xuất hiện trong project pane, bạn sẽ cần phải thêm nó vào project một cách thủ công. Để làm điều này, phải chuột trên tên project trong project pane, chọn “Add file”, xác định nơi file tạo ra, và thêm nó vào project.
Bây giờ khi bạn biên dịch chương trình của bạn, file mới sẽ được tự động thêm được include, và nó trở thành một phần của project của bạn.
Nếu file không biên dịch hoặc linking với Code::Blocks, chắc chắn file được thiết lập để biên dịch và link. Để thực hiện, phải chuột vào file trong project pane, và chọn properties. Dưới General tab, bạn nên kiểm tra xem file đã được chọn compiled và linked chưa.
Thêm file vào project của bạn từ command line
Từ của sổ command, bạn có thể tự tạo file thêm vào, sử dụng trình soạn thảo ưa thích của bạn, và đặt tên cho nó. Khi bạn biên dịch chương trình, bạn sẽ cần include tất cả file code phù hợp trên compile line. Ví dụ: “g++ main.cpp add.cpp –o main”, với main.cpp và add.cpp là tên của code file của bạn, và main là tên của file đầu ra.
Ví dụ về multi-file
Bây giờ, hãy xem xét các chương trình dưới đây.
add.cpp:
1
2
3
4
5
6
//#include "stdafx.h" // uncomment if using Visual Studio

int add(int x, int y)
{
    return x + y;
}
main.cpp:
1
2
3
4
5
6
7
8
9
//#include "stdafx.h" // uncomment if using Visual Studio
#include <iostream>

int main()
{
    using namespace std;
    cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
    return 0;
}

Thử biên dịch chương trình. Bạn sẽ thấy nó không biên dịch, và nó đưa ra lỗi giống như bài học trước với hàm được khai báo không đúng.
add.cpp(10) : error C3861: 'add': identifier not found
add.cpp(15) : error C2365: 'add' : redefinition; previous definition was 'formerly unknown identifier'

Khi trình biên dịch tiến hành biên dịch code file, nó không biết về sự tồn tại của hàm đó trong một file khác. Sự giới hạn về tầm nhìn này là được quy định trước, vì thế file có hàm hoặc biến có cùng tên trong một file khác tránh được lỗi trùng lặp tên.
Tuy nhiên trong trường hợp này, chúng ta muốn main.cpp biết về hàm add nằm trong add.cpp, chúng ta có thể khai báo như sau:
Main.cpp với tiền khai báo:

2
3
4
5
6
7
8
9
10
11
//#include "stdafx.h" // uncomment if using Visual Studio
#include <iostream>

int add(int x, int y); // needed so main.cpp knows that add() is a function declared elsewhere

int main()
{
    using namespace std;
    cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
    return 0;
}

Bây giờ, khi biên dịch chương trình nó sẽ biết được hàm add là gì. Sử dụng phương thức này, chúng ta có thể truy nhập đến hàm nằm trong file khác.
Thử biên dịch add.cpp và main.cpp với tiền khai báo. Nếu bạn xuất hiện một lỗi linker, chắc chắn rằng bạn đã thêm add.cpp vào project của bạn.
Có điều gì đó không đúng!
Có nhiều thứ bị sai trong lần đầu tiên bạn thử làm việc với nhiều file. Nếu bạn thử những ví dụ ở trên và bị lỗi, kiểm tra những điều sau:
1.    Nếu bạn xuất hiện lỗi biên dịch về add() chưa định nghĩa trong main(), bạn có thể quên tiền khai báo trong hàm main.
2.    Nếu bạn bị lỗi linker về add chưa được định nghĩa
unresolved external symbol "int __cdecl add(int,int)

2a. Lý do có thể nhất là add.cpp chưa được thêm vào project của bạn đúng cách. Nếu bạn đang sử dụng Visual Studio hoặc Code::Blocks, bạn nên xem add.cpp có được hiện trên Solution Explorer hoặc project pane nằm ở phía bên trái của IDE hay chưa?. Nếu bạn chưa phải chuột  vào project và add file, sau đó thử biên dịch lại. Nếu bạn đang biên dịch trên command line, đừng quên include cả main.cpp và add.cpp trong compile command.
2b. Có thể bạn đã thêm add.cpp sai project.
2c. Có thể file được thêm chưa cài đặt compile hoặc link. Kiểm tra file properties và chắc chắn file được cấu hình compiled/linked/ Trong Code::Blocks, compile và link nên được kiểm tra. Trong Visual Studio, có một “exclude từ build” mà nên được đặt “no” hoặc để trống.
3.    Nếu bạn đang sử dụng Visual Studio với tiền biên dịch headers, mọi code file cần được #include “stdafx.h”. Việc này phải thực hiện ở cả hai file main.cpp và add.cpp
4.    Không #include “add.cpp” trong file main.cpp. Điều này sẽ làm cho trình biên dịch chèn dung của file add.cpp trực tiếp vào main.cpp thay vì đối xử chúng như những file riêng lẻ. Trong khi nó có thể biên dịch và chạy đối với ví dụ đơn giản, bạn sẽ gặp phải vấn đề khi sử dụng phương pháp này.
Kết luận
Chúng ta sẽ bắt đầu làm việc với nhiều file một khi chúng ta sang phần lập trình hướng đối tượng, vì vậy bây giờ là thời điểm tốt để chắc chắn rằng bạn hiểu cách thêm và biên dịch project đa file.

Nhắc nhở: Bất kì khi nào bạn tạo một file code mới (.cpp), bạn sẽ cần thêm nó vào project của bạn để nó có thể biên dịch được.

Nguồn: learncpp.com

Nhận xét

Bài đăng phổ biến