Tôi đang sử dụng khung kiểm tra đơn vị dựa trên macro REQUIRE
để thực hiện xác nhận.Mở rộng Macro tiền xử lý trước không mong muốn
giản, những tác phẩm vĩ mô như thế này:
#define REQUIRE(expr) INTERNAL_REQUIRE(expr, "REQUIRE")
nào được định nghĩa tương tự như sau:
#define INTERNAL_REQUIRE(expr, macroName) \
PerformAssertion(macroName, #expr, expr);
PerformAssertion
's hai tham số đầu tiên là của các loại: const char*
. Lý do cho tham số thứ hai (#expr
) là do đó biểu thức chính xác được khẳng định có thể được ghi lại. Đây là nơi vấn đề nằm. Bộ tiền xử lý mở rộng biểu thức trước khi nó được chuyển thành một const char *
, do đó, nó không phải là cùng một biểu thức ban đầu được khẳng định.
Ví dụ:
REQUIRE(foo != NULL);
sẽ dẫn đến cuộc gọi này:
PerformAssertion("REQUIRE", "foo != 0", foo != 0);
Như bạn thấy, khái niệm được mở rộng một phần, ví dụ biểu thức foo != NULL
xuất hiện trong nhật ký là foo != 0
. NULL
(là một macro được xác định là 0
) đã được mở rộng bởi bộ tiền xử lý C trước khi xây dựng văn bản thông báo xác nhận. Có cách nào tôi có thể bỏ qua hoặc bỏ qua việc mở rộng cho văn bản tin nhắn không?
EDIT: Đây là giải pháp, cho bất cứ ai tò mò:
#define REQUIRE(expr) INTERNAL_REQUIRE(expr, #expr, "REQUIRE")
#define INTERNAL_REQUIRE(expr, exprString, macroName) \
PerformAssertion(macroName, exprString, expr);
Chỉ sử dụng 'INTERNAL_REQUIRE (expr, #expr," REQUIRE ")' thay vì biểu mẫu hai đối số? – kennytm
Yup, điều đó sẽ thực hiện. – Jeff