Một lợi thế quan trọng của việc triển khai dựa trên macro là nó không gắn với bất kỳ loại tham số cụ thể nào. Một macro giống như hàm trong các hành vi C, theo nhiều khía cạnh, như một hàm mẫu trong C++ (các mẫu trong C++ được sinh ra là các macro "văn minh hơn", BTW). Trong trường hợp cụ thể này, đối số của macro không có loại cụ thể.Nó có thể là hoàn toàn bất cứ điều gì có thể chuyển đổi thành loại unsigned long
. Ví dụ, nếu người dùng rất hài lòng (và nếu họ sẵn sàng chấp nhận các hậu quả được thực hiện), họ có thể chuyển các kiểu con trỏ tới macro này.
Dù sao, tôi phải thừa nhận rằng macro này không phải là ví dụ tốt nhất về tính linh hoạt loại độc lập của macro, nhưng nói chung tính linh hoạt trở nên tiện dụng khá thường xuyên. Một lần nữa, khi chức năng nhất định được thực hiện bởi một hàm, nó được giới hạn trong các kiểu tham số cụ thể. Trong nhiều trường hợp để áp dụng hoạt động tương tự cho các kiểu khác nhau, cần cung cấp một số hàm với các kiểu tham số khác nhau (và các tên khác nhau, vì đây là C), trong khi cùng có thể được thực hiện chỉ bằng một macro giống hàm. Ví dụ, vĩ mô
#define ABS(x) ((x) >= 0 ? (x) : -(x))
làm việc với tất cả các loại số học, trong khi thực hiện chức năng dựa trên phải cung cấp khá một vài trong số họ (tôi ngụ ý tiêu chuẩn abs
, labs
, llabs
và fabs
). (Và có, tôi nhận thức được những mối nguy hiểm được đề cập theo truyền thống của macro đó.)
Macro không hoàn hảo, nhưng phổ biến nhất về "macro giống như chức năng không còn cần thiết vì chức năng nội tuyến" chỉ đơn giản là vô nghĩa . Để thay thế hoàn toàn các macro giống như hàm C sẽ cần các mẫu chức năng (như trong C++) hoặc ít nhất là quá tải hàm (như trong C++ một lần nữa). Nếu không có các macro giống như hàm đó và sẽ vẫn là công cụ chính thống cực kỳ hữu dụng trong C.
Khi hàm băm đi, điều đó khá yếu - nhưng sau đó, có vẻ như dữ liệu phải xử lý cũng khá đơn giản. –
Trên thực tế, nó không phải là rất tươi sáng để làm cho điều này một 'vĩ mô'. Một [hàm tĩnh nội tuyến] (http://stackoverflow.com/questions/7762731/whats-the-difference-between-static-and-static-inline-function) có lẽ phù hợp hơn. * C * đã có nội tuyến từ năm 1999 và 'gcc' ngay cả trước đó. Câu hỏi này đã được trích dẫn là nhân bản [sử dụng định nghĩa kfifo] (http://stackoverflow.com/questions/16117304/why-is-kfifo-h-so-full-of-define-statements). Nếu ** MS-Windows ** là lý do mọi người nói macro này là hợp lý, chúng có liên quan như thế nào? –