在C中编写宏时,如何找到参数的类型和printf说明符?

我想用宏来扩展minunit更有用。

#define mu_assert_equal(actual, expected) do { \ if (actual != expected) { \ char *message = malloc(MAX_ERROR_MESSAGE_LENGTH); \ if (message == NULL) { printf("malloc failed"); exit(1); } \ snprintf(message, MAX_ERROR_MESSAGE_LENGTH, "required: %s != %s, reality: %s == %lu", \ #actual, #expected, #actual, actual); \ return message; \ } \ } while (0) 

调用:

 mu_assert_equal(bytes_parsed, 1); 

但上面的宏仅适用于无符号长值。

我怎么能找到宏参数的类型,更重要的是,他们的printf说明符。

你不能,在C11之前的C(增加generics )。

无法在C中计算表达式的类型,这是您需要做的。 如果可能,那么printf()首先不需要具有静态说明符,或多或少。

没有generics,也许最好的是不同类型的不同宏:

 #define mu_assert_equal(actual, expected, test, fmt) do { \ if ( test ) { \ char *message = malloc(MAX_ERROR_MESSAGE_LENGTH); \ if (message == NULL) { printf("malloc failed"); exit(1); } \ snprintf(message, MAX_ERROR_MESSAGE_LENGTH, "required: %s != %s, reality: %s == " fmt,\ #actual, #expected, #actual, actual); \ return message; \ } \ } while (0) #define mu_assert_equal_int(actual, expected) \ mu_assert_equal(actual, expected, actual != expected, "%lu") #define mu_assert_equal_str(actual, expected) \ mu_assert_equal(actual, expected, strcmp( actual, expected ), "%s") 

并调用为:

 mu_assert_equal_str( test_str, "abcde" ) ; mu_assert_equal_int( test_int, 12345 ) ; 

(根据评论编辑也将测试通过“通用”测试)。