[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
Đăng nhận xét