1
Sự khác nhau giữa define và const trong C/C++ là gì?
0
82321420 đã đăng:

Mọi người cho mình hỏi sự khác nhau giữa từ khóa define và từ khóa const trong C/C++ là như thế nào ạ?

thêm bình luận...
3
Bảo70 đã đăng:

Về mục đích sử dụng thì cả hai từ khóa này đều cùng chung chức năng đó là tạo một biến có giá trị không thể bị thay đổi

#include <iostream>
using namespace std;


#define MAX 100
// hoặc
//int const MAX = 100;


int main(){
    MAX = 2; // Sai, giá trị của biến không thể
             // bị thay đổi khi được khởi tạo bằng
             // #define hoặc từ khóa const
}

Nhưng chúng có hai sự khác nhau chính đó là:

  • Thứ nhất, #define được xem như là bộ xử lý trước, tức là giá trị giá trị của biến (macros) được định nghĩa bằng #define được thay thế bởi giá trị chúng ta đã khởi tạo, ví dụ ở trường hợp này với MAX = 100 trước khi trình biên dịch dùng nó. Điều này có nghĩa là giá trị 100 sẽ được sử dụng ngay trong chương trình mà không cần phải khởi tạo biến, cấp phát địa chỉ, ...v.v. Còn từ khóa const thường đi kèm với các từ khóa chỉ kiểu dữ liệu như int, float, ... cho nên nó được xem như là một biến và cần phải được khởi tạo, cấp phát địa chỉ cho biến, ... và được sử dụng như biến bình thường như ép kiểu,... .
  • Thứ hai, #define có thể được sử dụng để tạo một biểu thức thay vì một biến, trong khi đó từ khóa const không thể làm được việc này.

Bạn có thể xem đoạn chương trình dưới đây

#include <iostream>
using namespace std;


#define TONG(x) (x)+(x)


int main(){
    int a = TONG(2);
    cout << a << endl; // a = 4
}

Theo mình hiểu là như vậy, có gì thắc mắc hay sai bạn nói mình biết nha.

Bạn ơi, cho mình hỏi... Vậy khi tạo một macro thì nó có được lưu ở đâu đó trong bộ nhớ hay ko, để khi cần thì compiler biết và lấy ạ? Mình ko hiểu rõ khúc này, bạn có thể giải thích giùm mình ko!

Thiên Hảo 10.08.2018
1

... giá trị của biến (macros) được định nghĩa bằng #define được thay thế bởi giá trị chúng ta đã khởi tạo, ví dụ ở trường hợp này với MAX = 100 trước khi trình biên dịch dùng nó ...

Là câu mà bạn @Bảo chỉ nói chung chung không sâu, mình nghĩ câu này cần phải được giải thích một cách chi tiết.

Trước tiên bạn cần biết khái niệm Preprocessor trong C/C++ là gì? Nó có thể tạm dịch là bộ xử lý trước, tức là chương trình mã nguồn ban đầu bạn viết có dạng example.c (ngôn ngữ C) hoặc example.cpp (ngôn ngữ C++) sẽ được xử lý bởi Preprocessor trước khi nó thực sự chuyển tới Compiler theo sơ đồ như sau,

Các bước thực thi mã nguồn C/C++

Trước khi mã nguồn được nạp vào Compiler thì nó thật sự đã được biến đổi thành tập tin mã nguồn mở rộng (Example.l), mình lấy ví dụ đoạn mã nguồn có #define TONG(x) (x)+(x) ở trên sau khi qua giai đoạn Preprocessor sẽ thành,

#include <iostream>
using namespace std;

int main(){
    int a = (2) + (2);
    cout << a << endl;
}

Thứ mà Preprocessor đã làm là xem xem trong đoạn mã nguồn gốc có các macros nào không (macros là những định nghĩa đứng sau dấu #, ví dụ như #define, #include, ... ) thì thay thế ngay bằng giá trị đã khởi tạo, xem xem có comment nào không, nếu có thì loại bỏ. Có thể xem như nó dọn dẹp code và tạo nền trước khi chuyển cho Compiler để biên dịch.

Vậy câu trả lời cho câu hỏi của bạn là không, cái Compiler nhận là file mã nguồn mở rộng (Example.l), không còn là file mã nguồn gốc (Example.c) nữa, cho nên nó sẽ không cần biết và không thấy #define, ... nào cả.

Đôi khi bạn cần phải đào sâu xuống để biết được mã nguồn hoạt động như thế nào, bạn nên làm quen với các câu lệnh của GCC (GNU Compiler Collection), sử dụng câu lệnh gcc -E Example.cpp nếu bạn lập trình trên Linux để xem nội dung file mã nguồn mở rộng nhé, với lựa chọn -E là dừng lại ở sau quá trình Preprocessor để xem kết quả như trên, còn lập trình với Visual Studio thì sử dụng cl.exe.

xuans2huy 11.08.2018

Mình hiểu rồi, cảm ơn bạn rất nhiều!

Thiên Hảo 23.08.2018

Bạn có thể hướng dẫn mình cụ thể hơn sử dụng cl.exe trên Visual Studio như thế nào không ? Gõ vào khu vực code hay sao ?

YoonHo98 24.08.2018

@YoonHo98, bình luận này đã quá dài, mình đã yêu cầu mở câu hỏi mới , bạn có thể xem câu trả lời của mình tại câu hỏi bên dưới:

Làm thế nào để xem kết quả của C/C++ Preprocessor từ Visual Studio?

xuans2huy 24.08.2018
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)