根据documentation,Keil C51是基于C90的。所以它不支持 __VA_ARGS__ 这是 C99 的添加。
但是,您可以通过这个技巧来解决这个问题。使用带括号的参数。
#define LOGI(args) \
do { \
printf("[I] %s:%u: ", __FILE__, __LINE__); \
printf args; \
} while (0)
void f(void) {
LOGI(("address of f() = %p\n", f));
}
另一种可能的解决方案是提供一个带有可变数量参数的函数,请参阅example in the documentation。这是一种更简洁的方式,因为由于双括号,您可以在阅读源代码时使用此函数而无需“打嗝”。但请注意,这些参数并没有放在寄存器中,而是在堆栈和代码中使用了更多内存。
#include <stdio.h>
#include <stdarg.h>
void logi(const char* filename, int line, char *fmt, ...) {
va_list arg_ptr;
va_start(arg_ptr, fmt);
printf("[I] %s:%u: ", filename, line);
vprintf(fmt, arg_ptr);
va_end(arg_ptr);
}
void f(void) {
logi(__FILE__, __LINE__, "Hello %u %u", 1 , 2);
}
注意:您可能想要切换到另一个编译器,它支持比 30 年前的标准更新的一些标准。