+2 k thích
943 đã xem
trong Hỗ trợ kỹ thuật bởi (160 điểm)

Thầy cô và các bạn cho em hỏi:
Em thấy code demo trên http://docs.opencv.org có đoạn thế này

int hàm()

{

       <lệnh>

#if 0
       <lệnh>
#else
       <lệnh>
#endif
       return 0;

}

 

Em thắc mắc là:
1. tại sao dùng #if, #else, #endif maf không dùng cấu trúc if else bình thường cho nó sáng sủa

2. có phải "#if 0" tương đương với if(false){lệnh}? nếu vậy thì đoạn lệnh đó sẽ k bao giờ được thực thi, thì viết vào chương trình làm gì???

Cảm ơn mọi người đã dành thời gian xem qua.

bởi (3.2k điểm)
lần sau có hỏi về lập trình thì đặt category là Kiến thức CNPM nha bạn...không phải Kỹ thuật đâu... =D
bởi (160 điểm)
hờ, đọc categories thì cứ tưởng ký thuật là kỹ thuật code, và CNPM là về quy trình, yêu cầu và thiết kế PM ==
bởi (3.2k điểm)
thật ra thì lúc mới tạo q2a thì chưa có category Kiến thức CNPM đâu, lúc đó mình hỏi về code cũng để trong Kỹ thuật vì cũng có suy nghĩ như bn, sau đó thì ad mới cho thêm cái Kiến thức CNPM để hỏi về lập trình đấy =D

4 Trả lời

0 k thích
bởi (240 điểm)
hiện lại bởi
Chào bạn,
Theo mình nghĩ thì đây chỉ là mã giả để mình viết code thôi

Tùy vào ngôn ngữ mình viết mà cách viết sẽ có khác nhau..

Dùng mã giả để dể dàng cho việc tư duy cũng như kiểm tra tính logic của thuật toán trước khi bắt đầu viết bằng 1 một ngôn ngữ cụ thể nào đó, như C/C++ chẳng hạn..

p/s: chỉ là cách nghĩ của mình, mong mọi người góp ý thêm
0 k thích
bởi (2.7k điểm)
Thường thì các chỉ thị tiền xử lý #if, #else, #endif để tách biệt các chế độ khác nhau của một chương trình (Chẳng hạn nếu muốn biên dịch đoạn chương trình nào đó cho chế độ test, demo, log v.v..). Các chỉ thị này theo mình nhớ chỉ được xét khi biên dịch chương trình và không có ý nghĩa khi chạy chương trình. Trong trang của bạn đưa mình thấy chủ yếu để kiểm tra phiên bản và đưa ra các hướng cài đặt khác nhau để giải quyết.
+5 k thích
bởi (4.8k điểm)

Trong C/C++, các lệnh có # ở đầu là các lệnh tiền xử lý (preprocessor directive), các lệnh này được thực thi TRƯỚC khi trình biên dịch (compiler) biên dịch (compile) chương trình của bạn. Ví dụ: #define, #if, #include,...

Đoạn code nằm trong #if và #endif (cũng có thể là #else) chỉ được compile nếu thỏa điều kiện của một symbol (mình không biết tv gọi là gì cho phù hợp)  nào đó được định nghĩa bằng #define. Ví dụ:

#define PI 3.14

#if PI>3.14

<code A>

#else

<code B>

#endif

Trong ví dụ trên code A sẽ không được compile vì symbol PI không lớn hơn 3.14 nhưng code B sẽ được compile vì #else thì đúng PI <= 3.14

#if 0 nghĩa là đoạn code trong nó sẽ luôn luôn không được compile, giống như ta tạm thời chuyển comment nguyên đoạn code đó ấy.

Sự khác nhau của #if và if: các câu lệnh if vẫn chỉ là các đoạn code bình thường và vẫn được compiler luôn luôn compile, còn #if thì được kiểm tra trước khi compile và nếu không thỏa thì có thể nói rằng đoạn code trong #if đó không có nằm trong chương trình của bạn :))

Ngoài ra còn nhiều các lệnh tiền xử lý (#) khác nữa nếu bạn muốn tìm hiểu thêm:

http://www.cplusplus.com/doc/tutorial/preprocessor/

bởi (4.8k điểm)
Update: lợi ích chính của #if so với comment hóa code: chuyển qua nhanh lại giữa code cần compile, và quan trọng nhất là vẫn đảm bảo syntax color (màu biến, hàm, cú pháp,...) giúp việc đọc code dễ dàng hơn, nhất là nếu code dài, mà comment thì chỉ toàn màu xanh lá.
bởi (160 điểm)
thank bạn nhìu :3 rất bổ ích và dễ hiểu :)
+1 thích
bởi (3.2k điểm)

mình nghĩ với nhiêu đó trả lời thì chắc bn cũng đã hiểu #if  để làm gì rồi chứ hak, m xin nói thêm về công dụng của nó:

1. vì #if và #else chỉ có 1 trong 2 tụi nó là được biên dịch, nên 1 cái còn lại giống như là được comment, trong trường hợp bạn muốn test 2 đoạn code cùng 1 công việc, thì test đoạn này bn phải comment đoạn kia và ngược lại, thì cách này sẽ có lợi trong trường hợp đoạn code trong mỗi phần hơi dài, thì chỉ việc thay giá trị #if 0 -> #if 1 và ngược lại là được (khỏi phải comment luôn một đoạn dài, còn nếu bạn thích nhìn màu xanh comment cho đẹp thì có thể comment, không sao hak ) smiley

2. nếu như bạn để if else thông thường thì khi biên dịch sẽ biên dịch cả 2 đoạn code, còn #if và #else thì chỉ có 1 trong 2 => app của bn (file exe) sẽ nhẹ hơn so với dùng cách thông thường rồi laugh

p/s: đó chỉ là suy nghĩ của mình,có gì mọi người góp ý thêm nhá... cheeky

bởi (4.8k điểm)
Đúng là nhẹ hơn, nhưng sự khác biệt vô cùng nhỏ, không mang lại lợi ích gì cả, đó thực sự không phải là "công dụng" của #if.
bởi (2.2k điểm)
Phát triển đa nền tảng sẽ thấy công dụng đó mới là công dụng hữu hiệu chính của #if, chứ không phải là để comment code như bạn trả lời trong comment ở trên. Và cái nhẹ hơn đó là nhẹ hơn rất nhiều với hệ thống lớn (hãy tưởng tượng cảnh mã biên dịch chạy trên linux lại có mã gọi hàm của windows?!?), cho nên bạn đã nói sai về công dụng của #if rồi. Câu trả lời của bạn chỉ phù hợp với câu hỏi công dụng của #if 0 thôi.
bởi (4.8k điểm)
đã sửa bởi
Nhưng trong trường hợp phát triển lớn như thế thì tách file ra với tên có ý nghĩa và chỉ #include file nào cần biên dịch thì không phải khả quang hơn là bỏ những đoạn code (lớn đến mức có sự khác biệt rõ rệt về dung lượng) trong cùng một file giữa các #if, #else?
Vả lại ý em #if không phải là để comment code, mà là để test code THẬT SỰ, cái vụ comment hóa code thật ra được lợi dụng để test code chứ mục đích đúng của nó là chỉ để....comment.
bởi (3.2k điểm)
thank thầy và các bạn đã góp ý, mình sẽ tìm hiểu thêm =D
bởi (2.2k điểm)
Không phải chỉ đơn giản như vậy. Quan trọng nhất là đoạn mã kết nối giữa mã tổng quát (độc lập nền tảng) với mã phụ thuộc nền tảng, trong đó tùy theo nền tảng mà phải gọi hàm khác nhau. Việc này đòi hỏi if/else để chọn cả #include và lệnh gọi hàm
bởi (4.8k điểm)
Nhưng mục tiêu vẫn là để test code phải không ạ? Chứ em vẫn không tưởng tượng được một lập trình viên dùng #if, #else với tư tưởng để giảm dung lượng file chạy. (Có bao nhiêu dòng code trong cùng 1 file để dung lượng file executable có thể tăng thêm 1MB?)
bởi (2.2k điểm)
Dung lượng file chạy phụ thuộc vào ngôn ngữ đích (machine-code hay bytecode) do đó không biết chắc là một dòng mã nguồn (source code) thì sẽ ra bao nhiêu mã đích. Ở đây căn bản là mong muốn tạo ra các phiên bản mã thực thi khác nhau (ví dụ như debug/release versions, professional/community versions, Windows/Linux versions v.v.). Việc loại bỏ các mã không liên quan không chỉ là giảm dung lượng, mà còn giảm các nguy cơ bị hack mã (từ bản community chuyển sang bản pro, hay reverse mã, v.v.), nguy cơ giảm hiệu suất thực thi - nói chung là các nguy cơ phát sinh khi để những mã thừa không cần thiết trong chương trình đem đi deploy
Chào mừng đến với Q&A FIT. Bạn có thể đặt câu hỏi và nhận được câu trả lời từ các bộ phận hỗ trợ và những thành viên khác tại Khoa Công nghệ Thông tin, Trường Đại học Khoa học Tự nhiên, Đại học Quốc gia TP.HCM. Bạn hãy đăng nhập bằng tài khoản Google để gửi hoặc trả lời các câu hỏi.
...