Vấn đề không phải là về lý thuyết: với lý do nào đó, muốn có macro mở rộng khác nhau theo giá trị của tham số được truyền cho nó và tham số này là hằng số, được biết đến macro preprocessor, không có lý do tại sao nó không thể làm việc ... cho một bộ xử lý macro chung ... Nhưng cpp unluckly không cho phép sự hiện diện của các bộ xử lý macro "lệnh" khác vào một định nghĩa macro ...
Vì vậy, bạn
#define foo(x) \
#if x>32 \
x \
#else \
2*x \
#endif
không mở rộng đến
#if X>32
X
#else
2*X
#endif
trong đó X là tham số được biết đến (để thay đổi X để ví dụ 31), đòi hỏi một đường chuyền bằng vi xử lý.
Ngoài ra, các dòng mới bị bỏ qua, trong khi chúng quan trọng cho việc sử dụng như vậy; nếu không, sau có thể được coi như một thủ thuật (cần tuy nhiên một tiền xử lý vượt qua)
#define foo(x,y) \
y if x>32 \
x \
y else \
2*x \
y endif
rằng với foo(20,#)
sản xuất
# if 20>32 20 # else 2*20 # endif
mà sẽ làm việc, nếu nó sẽ là
# if 20>32
20
# else
2*20
# endif
... nhưng không phải (và như đã nói, đầu ra của bộ tiền xử lý phải được nạp lại cho bộ tiền xử lý một lần nữa ...)
Vì vậy, câu trả lời của tôi là nếu bạn cần những thứ này, bạn không thể sử dụng bộ tiền xử lý C; bạn nên sử dụng bộ tiền xử lý C không phổ biến (không chuẩn?), hoặc chỉ là một bộ xử lý macro khác, và nếu bạn cần những thứ mà "cpp" phải "tích hợp" với C, thì bạn không thể sử dụng cái chung (như M4) thật dễ dàng ...
Tôi có thể hỏi tại sao bạn cần macro cho điều này? Một chức năng sẽ sạch hơn và (loại) an toàn hơn. –
Nếu bạn biết đủ nhỏ để đặt câu hỏi này, bạn nên quên rằng '#define foo (x)' xây dựng tồn tại vì nó sẽ chỉ giúp bạn viết mã rằng nếu nó hoạt động như vậy một cách tình cờ. – msw
Tôi muốn bộ tiền xử lý C thực hiện đánh giá instaed kiểm soát dòng thời gian chạy. Bằng cách này tiết kiệm thời gian tại thời gian chạy – richard