簡體   English   中英

可移植地擴展va_list

[英]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_startva_endva_argva_copy 這些都不能用於將va_list轉換回可變數量的值,而不是逐個轉換。

你的第三方庫應該提供了一個函數vsecretfoo(int, va_list) ,就像標准庫對這些情況一樣( vprintf等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM