【C语言】可变参数整花活被卡住

发布于:2024-07-01 ⋅ 阅读:(16) ⋅ 点赞:(0)
我的意思是C语言无法实现这种效果

#include <stdarg.h>
#include <stdio.h>


// 封装 vprintf 的函数 
void log1(const char* format, ...) {
    va_list args;
    va_start(args, format);
	vprintf(format, args);
    va_end(args);
}

// 封装 vprintf 的函数 
void log2(const char* format, ...) {
    va_list args;
    va_start(args, format);
	vprintf(format, args);
    va_end(args);
}

// 自由选择log
void my_log(int a1, const char* format, ...) {
	va_list args;
	if(a1 == 1){
		va_start(args, format);
		log1(format, args);
		va_end(args);
	}else if(a1 == 2){
		va_start(args, format);
		log2(format, args);
		va_end(args);
	}
}

int main() {
    log_message("This is a test: %s with number %d.\n", "test", 42);
    return 0;
}

log1和log2代码被别人封装成了库,所以可以理解为无法被修改。然后按你所说,不能两次va_start同一个变量。所以C语言无法实现对吗?

kimi

理解您的意图了,您的代码示例中确实存在问题,因为 log1log2 函数都试图封装 vprintf 并使用自己的 va_list。但是,正如您提到的,如果 log1log2 是库函数,我们不能修改它们,那么问题就出现了:在 my_log 函数中,我们不能对同一个 va_list 变量使用两次 va_start

在这种情况下,C语言确实不允许您在 my_log 函数中这样做。但是,您可以重新设计 my_log 函数,以便它不违反 va_list 的使用规则。一种方法是在 my_log 函数中不初始化 va_list,而是将初始化的责任委托给 log1log2 函数。这意味着 log1log2 需要能够接受一个额外的 va_list 参数,或者它们需要以某种方式能够访问 my_log 函数的可变参数列表。

然而,由于 log1log2 已经被封装成库函数,我们不能修改它们以接受额外的 va_list 参数,这使得直接在 my_log 中调用 log1log2 并传递 args 变得不可能。

这里有一种可能的解决方案,尽管它依赖于库函数的设计允许某种形式的参数传递或访问:

#include <stdarg.h>
#include <stdio.h>

// 假设 log1 和 log2 是这样定义的库函数
void log1(const char* format, va_list args) {
    vprintf(format, args);
}

void log2(const char* format, va_list args) {
    vprintf(format, args);
}

// 自由选择 log 函数
void my_log(int a1, const char* format, ...) {
    va_list args;
    va_start(args, format); // my_log 中初始化 va_list

    if (a1 == 1) {
        log1(format, args); // 直接调用 log1,不传递 va_list
    } else if (a1 == 2) {
        log2(format, args); // 直接调用 log2,不传递 va_list
    }

    va_end(args); // 清理 va_list
}

int main() {
    my_log(1, "This is a test: %s with number %d.\n", "test", 42);
    return 0;
}

请注意,这个解决方案假设 log1log2 能够以某种方式访问 my_log 的可变参数列表。如果库函数不允许这样做,那么您将无法在 my_log 函数中根据条件选择调用 log1log2,因为您不能在 my_log 中初始化 va_list 并将其传递给 log1log2

在这种情况下,您可能需要重新考虑设计,或者寻找其他方法来实现您的需求,例如通过宏或者条件编译来选择使用 log1log2