Hai Anh Em Typedef Và Define Trong C++

Trong C++ cung cấp cho người lập trình 2 từ khóa typedef & define rất quan trọng và phổ biến mà bất kì ai học cũng nên biết và sử dụng nó như một thói quen. Chúng có ưu điểm như thế nào mời các bạn xem bài viết của mình nhé.

Từ khóa typedef

typedef là từ khóa cho phép người dùng thêm tên mới cho kiểu có sẵn với cú pháp như sau: 

typedef key_word new_name_use;

Ví dụ:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long int uln;
int main()
{
	ll val = 100000000;
	db val1 = 1.1;
	uli val2 = 1000000000;
	cout<<val<<endl;
	cout<<val1<<endl;
	cout<<val2<<endl;
 return 0;
 }

Khi này kiểu dữ liệu long long bạn hoàn toàn có thể thay thế bằng ll khi code.

NOTE: bạn hoàn toàn có thể thêm nhiều tên mới cho một kiểu.

Từ khóa typedef có thể thêm tên mới cho class hay struct được không? Các bạn cùng mình xét ví dụ sau đây nhé:

#include <bits/stdc++.h>
using namespace std;
class CodeLearn {
public:
CodeLearn()
{
	cout<<"Code Learn"<<endl;
}
};
typedef CodeLearn CL;
struct codelearn {
void printf()
{
	cout<<"code learn"<<endl;
}
};
typedef codelearn cl;
int main()
{
	CL CL1;
	cl cl1;
	cl1.printf();
 return 0;
 }

Kết quả của chương trình:  

Code Learn

code learn 

Như vậy ta có thể thấy typedef có thể thêm được tên mới cho các kiểu mà người dùng định nghĩa (class & struct) và nó giúp chúng ta dễ ghi nhớ tên của các kiểu dữ liệu, lớp hay cấu trúc một cách dễ dàng, dễ hiểu và dễ sử dụng hơn. Đồng thời nó cũng giúp giảm đi thời gian code đáng kể đấy.

Một lưu ý nhỏ là cú pháp khi dùng typedef không thể thay thế như sau:

typedef new_name_use key_word; lỗi này tuy nhỏ nhưng cá nhân mình thấy có thấy nhiều bạn khi mới sử dụng rất hay bị sai. 

Từ khóa define

define cũng là một từ khóa cho phép bạn đặt một tên mới cho một kiểu dữ liệu, một số hay một hàm với cú pháp như sau:

define new_name_use name_want_swap 

Xét ví dụ:

#include <bits/stdc++.h>
using namespace std;
#define number int
#define loop(i,a,n) for(int i=0 ; i<n ; i++)
#define pub push_back
#define pob pop_back

int main()
{
          
	number n; //khai báo biến n kiểu int
	cout<<"N = ";
	cin>>n;
	vector <int> arr; //tạo 1 vector arr kiểu int
        //tạo giá trị cho các phần tử của vector
	loop(i,0,n)
	{
		arr.pub(i);
	}
	arr.pob(); // xóa phần tử cuối cùng của vector arr
        //in ra các giá trị của vector arr
	loop(i,0,arr.size())
	{
		cout<<arr[i]<<" ";
	}
	return 0;
}

Kết quả của chương trình:     

Xét câu lệnh #define loop(i,a,n) for(int i=0 ; i<n ; i++) ở đây loop(1,a,n) sẽ được thay thế bởi for(int i=0 ; i<n ; i++) khi chương trình chạy.

Còn push_back là câu lệnh thêm phần tử vào cuối vector sẽ được thay thế bởi pub , pop_back là câu lệnh bỏ đi phần tử cuối cùng của vector sẽ được thay thế bởi pob.

Như vậy chúng ta có thể thấy #define rất mạnh khi lập trình, nó giúp chúng ta thay thế được mọi thứ bằng một tên gọi mới gợi nhớ hơn, chúng ta có thể khai báo hằng, có thể thay thế vòng lặp, có thể thay thế tên kiểu,… Đặc biệt hơn nó giúp chúng ta giảm tải 1 khoảng thời gian code đi code lại những đoạn code trùng nhau, giúp cho chương trình trở nên ngắn gọi và dễ hiểu hơn.

Một lưu ý nhỏ là cú pháp khi dùng define không thể thay thế như sau:

define new_name_use name_want_swap; hay define name_want_swap new_name_use  lỗi này tuy nhỏ nhưng cá nhân mình thấy có thấy nhiều bạn khi mới sử dụng rất hay bị sai. 

Khi code chúng ta không được phép đặt tên biến giống với tên được thay thế ở #define. Vì, define hoạt động theo cơ chế precompile(tiền biên dịch) tức là dịch trước chạy sau.

Xét ví dụ cụ thể cho dễ hiểu nhé:

#include <bits/stdc++.h>
using namespace std;
#define PI = 3.14159
int main()
{
	double PI = 3.14;
	return 0;
 }

Các bạn thử chạy xem lỗi như thế nào nhé!

Điểm khác nhau giữa hai anh em TYPEDEF & DEFINE

Xét tổng thể các ví dụ trên thì chúng ta có thể thấy điểm khác nhau lớn nhất giữa typedef & define là: typedef chỉ có thể thêm tên mới cho các kiểu có sẵn hoặc do người dùng định nghĩa còn define nó rộng hơn typedef ở chỗ là nó có thể thay thế hoặc định nghĩa cho biến, cho kiểu, cho vòng lặp…

Sự phiên dịch typedef được thực hiện bởi bộ biên dịch, trong khi lệnh #define được xử lý bởi bộ tiền xử lý.

Kết

Khi học tập và làm việc với C++ chắc chắn sẽ không thể bỏ qua kiến thức về typedef & define. Qua bài viết này mình đã giới thiệu cũng như minh họa cụ thể cho các bạn về hai anh em typedef & define, mong các bạn có thể hiểu và áp dụng chúng thường xuyên. Hẹn gặp các bạn trong các bài viết tiếp theo.