【问题标题】:C language: How to pass a variable arguments list of void* to a functionC 语言:如何将 void* 的变量参数列表传递给函数
【发布时间】:2018-02-20 06:37:57
【问题描述】:

我正在尝试将 void* 元素的可变参数列表传递给 C 中的函数。

  1. 我该怎么做?

  2. 如何计算列表中的项目数?

  3. 如何循环遍历 var-args 列表并传递每个 void* 项 到另一个以 void* 项作为参数的函数?

这是我所做的,但它不起作用。

 void AddValues(List* data, void* args, ...) {

 int len = sizeof (args) / sizeof (*args);


 for(int i=0;i<len;i++){ processItem(args[0]); }

 }

 void processItem(void* item){

 }

【问题讨论】:

  • 你不能这样计算长度。 sizeof (args) / sizeof (*args) = sizeof(void*) / sizeof(void) 但 void 没有大小。采用可变参数列表的函数需要能够从其他来源确定大小: - 另一个参数(printf 使用格式字符串中 % 的数量)或特殊值(如所有 void* 指针指向事物和最后一个一个是 NULL) 所以要么第一个参数必须是大小,要么你的最后一个 void* 必须有一个特殊的标记值。
  • @gbenroscience 您的 void* 参数与 var-args 的 ... 完全无关。你不能尊重void*,如果可以的话,它不会告诉你有多少东西被指向或任何东西,因为就编译器而言,它只是一个指向void的指针。

标签: c variadic-functions


【解决方案1】:

如何计算列表中的项目数?

你不能。它必须是提供的或可派生的。

如何循环遍历 var-args 列表并将每个 void 项传递给另一个以 void* 项作为参数的函数?*

Variadic Functions 中所述,

#include <stdarg.h>

void AddValues(int count, ...) {
   va_list args;
   va_start(args, count);

   for(int i=count; i--; )
      processItem(va_arg(args, void*));

   va_end(args);
}

示例用法:

void* p1 = ...;
void* p2 = ...;
void* p3 = ...;
void* p4 = ...;

AddValues(4, p1, p2, p3, p4);

这取决于你在做什么,但你可能应该使用数组而不是可变参数。

void AddValues(int count, const void** args) {
   for(int i=count; i--; )
      processItem(*(args++));
}

示例用法:

#define C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0]))

void* ptrs[4];
ptrs[0] = ...;
ptrs[1] = ...;
ptrs[2] = ...;
ptrs[3] = ...;

AddValues(C_ARRAY_LEN(ptrs), ptrs);

或者(如果指针不能为NULL):

void AddValues(const void** args) {
   while (*args != NULL)
      processItem(*(args++));
}

示例用法:

void* ptrs[5];
ptrs[0] = ...;
ptrs[1] = ...;
ptrs[2] = ...;
ptrs[3] = ...;
ptrs[4] = NULL;

AddValues(ptrs);

【讨论】:

  • 那么 va_arg 和 va_end 是内置函数吗?
  • @gbenroscience 标准库函数。尽可能接近内置。标准版本与标准版本之间可能会有一些变化,但 C 倾向于保守地对其进行更改,以避免在 50 年的遗留代码上崩溃。
  • 是的,我刚刚找到了。谢谢
猜你喜欢
  • 2021-11-03
  • 2022-09-30
  • 1970-01-01
  • 2021-11-19
  • 2015-09-23
  • 2015-01-05
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多