Có một vài điều nghiêm chỉnh về macro.
Chúng là xử lý văn bản và không bị nhiễu. Nếu bạn #define foo 1
, thì việc sử dụng sau đó foo
làm số nhận dạng sẽ không thành công. Điều này có thể dẫn đến lỗi biên dịch lẻ và lỗi thời gian chạy khó tìm.
Chúng không có đối số theo nghĩa thông thường. Bạn có thể viết một hàm sẽ nhận hai giá trị int
và trả về giá trị tối đa, vì các đối số sẽ được đánh giá một lần và các giá trị được sử dụng sau đó. Bạn không thể viết macro để làm điều đó, bởi vì nó sẽ đánh giá ít nhất một đối số hai lần và không thành công với một cái gì đó như max(x++, --y)
.
Cũng có những cạm bẫy phổ biến. Thật khó để có được nhiều câu lệnh ngay trong chúng, và chúng đòi hỏi rất nhiều dấu ngoặc đơn thừa.
Trong trường hợp của bạn, bạn cần ngoặc:
#define radian2degree(a) (a * 57.295779513082)
cần phải được
#define radian2degree(a) ((a) * 57.295779513082)
và bạn vẫn đang giẫm lên bất cứ ai viết một hàm radian2degree
trong một số phạm vi bên trong, tự tin rằng đó định nghĩa sẽ hoạt động trong phạm vi riêng của nó.
Nguồn
2009-10-28 22:07:45
Trong trường hợp này, level2radian (45 + a/2.0) không làm những gì bạn nghĩ. Luôn luôn ngoặc đơn mọi đối số trong việc mở rộng - tốt, hầu như luôn luôn; các ngoại lệ chính là khi bạn đang làm những việc như dán mã thông báo hoặc xâu chuỗi. –
những gì Jonathan nói - một điều tồi tệ hơn nhìn thấy một định nghĩa vĩ mô đó là một nỗi đau trong ass để đọc vì tất cả các parens damn, là đi qua một định nghĩa vĩ mô mà không có tất cả những parens damn. –
Ngoài ra còn có quy ước ALLCAPS cho các macro, ít nhất là đặt chúng vào không gian tên giả của riêng chúng. –