[英]expanding va_list portably
我有簽名的第三方功能:
int secretfoo(int numargs, ...);
我可以直接調用它,但我真正想要的是用我的函數包裝它,為它添加一些額外的參數。
假設整數的簡單情況:我希望將secretfoo(2, 10, 20)
調用翻譯為:當我看到參數10復制它並進行調用時: secretfoo(3, 10, 10, 20)
。 我想在包裝器中做到這一點:
int foowrapper(int numargs, ...);
這個包裝器分析了如上所述的argumetns和call secretfoo
。
這可以用va_list
/ va_arg
等方便地完成嗎? 還有其他方法嗎?
沒有可移植的方法來直接操作變量參數列表中的參數,因為它是高度平台依賴的,如何將這些參數傳遞給函數。 在大多數硬件體系結構中,絕對無法在列表的中間或末尾插入其他參數。
如果參數的數量存在實際上限,那么可以通過提取foowrapper
所有參數並“手動”構建調用secretfoo
的新參數列表來secretfoo
。
代碼看起來像這樣:
int foowrapper(int numarg, ...)
{
va_list args
int newargs[numarg*2]; /* worst case allocation */
int numnewargs = 0;
/* Extract the arguments */
va_start(numarg, args);
for (int i=0; i<numarg; i++)
{
newargs[numnewargs++] = va_arg(args, int);
/* duplicate value 10 as you encounter it */
if (newargs[numnewargs-1] == 10)
{
newargs[numnewargs++] = 10;
}
}
/* Forward to the secretfoo function */
switch (numnewargs)
{
case 0: return secretfoo(0);
case 1: return secretfoo(1, newargs[0]);
case 2: return secretfoo(2, newargs[0], newargs[1]);
/* etc... */
}
}
我擔心它無法輕松完成。 stdarg.h
“定義了四個宏”(最新的C標准草案 ): va_start
, va_end
, va_arg
和va_copy
。 這些都不能用於將va_list
轉換回可變數量的值,而不是逐個轉換。
你的第三方庫應該提供了一個函數vsecretfoo(int, va_list)
,就像標准庫對這些情況一樣( vprintf
等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.