我的意思是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
理解您的意图了,您的代码示例中确实存在问题,因为 log1
和 log2
函数都试图封装 vprintf
并使用自己的 va_list
。但是,正如您提到的,如果 log1
和 log2
是库函数,我们不能修改它们,那么问题就出现了:在 my_log
函数中,我们不能对同一个 va_list
变量使用两次 va_start
。
在这种情况下,C语言确实不允许您在 my_log
函数中这样做。但是,您可以重新设计 my_log
函数,以便它不违反 va_list
的使用规则。一种方法是在 my_log
函数中不初始化 va_list
,而是将初始化的责任委托给 log1
和 log2
函数。这意味着 log1
和 log2
需要能够接受一个额外的 va_list
参数,或者它们需要以某种方式能够访问 my_log
函数的可变参数列表。
然而,由于 log1
和 log2
已经被封装成库函数,我们不能修改它们以接受额外的 va_list
参数,这使得直接在 my_log
中调用 log1
或 log2
并传递 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;
}
请注意,这个解决方案假设 log1
和 log2
能够以某种方式访问 my_log
的可变参数列表。如果库函数不允许这样做,那么您将无法在 my_log
函数中根据条件选择调用 log1
或 log2
,因为您不能在 my_log
中初始化 va_list
并将其传递给 log1
或 log2
。
在这种情况下,您可能需要重新考虑设计,或者寻找其他方法来实现您的需求,例如通过宏或者条件编译来选择使用 log1
或 log2
。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 【C语言】可变参数整花活被卡住
发表评论 取消回复