請看下面的測試案例:傳遞一個參數列表,以兩個V * printf()的調用
#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
void test(char **outa, char **outb, const char* fstra, const char* fstrb, ...) {
va_list ap;
va_start(ap, fstrb);
vasprintf(&outa, fstra, ap);
vasprintf(&outb, fstrb, ap);
va_end(ap);
}
int main(void) {
char *a, *b;
test(&a, &b, "%s", " %s\n", "foo", "bar");
/* ... */
}
這裏的意圖是,test()
功能需要對他們倆兩種格式字符串和參數列表。第一個格式字符串應該「吃」儘可能多的參數,其餘的應該用於第二個格式字符串。
所以,這裏的預期結果是foo
& bar
這就是我用glibc得到的結果。但AFAICS機器運行鍵盤(猜猜它是一些* BSD),給出foo
& foo
並且我的猜測是它在參數列表上使用了va_copy()
。
我想我在這裏打一個不確定的(和醜陋的)行爲;所以問題是:有沒有辦法實現雙格式字符串printf()
而不從頭重新實現?有沒有一種很好的方式來檢查使用autoconf的行爲,而不使用AC_RUN_IFELSE()
?
我想一些掃描格式字符串的消耗參數的數量的快速方法也可以在這裏工作(+ va_copy()
)。
嗯,你在最後一句話中並不完全正確。一種可移植的方式是將'v * printf()'完全重新實現爲一次使用兩個格式字符串並直接獲取參數。 –
@Michal,好點。我已經澄清它將該聲明限制在腳註中列出的更高級功能。 – paxdiablo
嗯,我想過串接,這可能是我最終使用的。但我認爲沒有辦法將兩個結果分開(我在實際代碼中使用'vasprintf()'),而沒有冒着相同的sep被'%s'格式之一返回的風險。 –