#if và #define MY_MACRO (0)
Sử dụng #if có nghĩa là bạn đã tạo macro "xác định", tức là một thứ gì đó sẽ được tìm kiếm trong mã sẽ được thay thế bằng "(0)". Đây là "địa ngục vĩ mô" mà tôi ghét thấy trong C ++, vì nó gây ô nhiễm mã với các sửa đổi mã tiềm năng.
Ví dụ:
#define MY_MACRO (0)
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
đưa ra lỗi sau trên g ++:
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
Chỉ một lỗi.
Điều đó có nghĩa là macro của bạn đã tương tác thành công với mã C ++ của bạn: Lệnh gọi hàm đã thành công. Trong trường hợp đơn giản này, nó là thú vị. Nhưng kinh nghiệm của riêng tôi với các macro chơi thầm mã của tôi không phải là niềm vui và đầy đủ, vì vậy ...
#ifdef và #define MY_MACRO
Sử dụng #ifdef có nghĩa là bạn "xác định" một cái gì đó. Không phải bạn cung cấp cho nó một giá trị. Nó vẫn đang gây ô nhiễm, nhưng ít nhất, nó sẽ được "thay thế bằng không", và không bị mã C ++ coi là câu lệnh mã trễ. Đoạn mã tương tự ở trên, với một định nghĩa đơn giản, nó:
#define MY_MACRO
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
Đưa ra các cảnh báo sau:
main.cpp||In function ‘int main(int, char**)’:|
main.cpp|406|error: expected unqualified-id before ‘=’ token|
main.cpp|399|error: too few arguments to function ‘int doSomething(int)’|
main.cpp|407|error: at this point in file|
||=== Build finished: 3 errors, 0 warnings ===|
Vì thế...
Phần kết luận
Tôi muốn sống mà không có macro trong mã của mình, nhưng vì nhiều lý do (xác định trình bảo vệ tiêu đề hoặc macro gỡ lỗi), tôi không thể.
Nhưng ít nhất, tôi muốn làm cho chúng ít tương tác nhất có thể với mã C ++ hợp pháp của tôi. Có nghĩa là sử dụng #define mà không có giá trị, sử dụng #ifdef và #ifndef (hoặc thậm chí #if được định nghĩa theo đề xuất của Jim Buck) và hơn hết, đặt tên cho họ quá dài và xa lạ sẽ không ai có suy nghĩ đúng đắn của họ sẽ sử dụng nó "tình cờ", và nó sẽ không ảnh hưởng đến mã C ++ hợp pháp.
Đoạn tái bút
Bây giờ, khi tôi đang đọc lại bài đăng của mình, tôi tự hỏi liệu tôi có nên cố gắng tìm một số giá trị không bao giờ chính xác trong C ++ để thêm vào định nghĩa của mình hay không. Cái gì đó như
#define MY_MACRO @@@@@@@@@@@@@@@@@@
có thể được sử dụng với #ifdef và #ifndef, nhưng không cho phép biên dịch mã nếu được sử dụng bên trong một hàm ... Tôi đã thử điều này thành công trên g ++ và nó xuất hiện lỗi:
main.cpp|410|error: stray ‘@’ in program|
Hấp dẫn. :-)
#if
, bạn cũng có thể sử dụng#elif
theo cách nhất quán, không giống như với#ifdef
. Do đó, thay vì chỉ sử dụng#define BLAH
, hãy sử dụng#define BLAH 1
với#if BLAH
, v.v.