相关疑难解决方法(0)

从技术上讲,可变函数如何工作?printf如何工作?

我知道我可以va_arg用来编写自己的可变参数函数,但是可变函数如何在引擎盖下工作,即在汇编指令级别?

例如,如何printf采用可变数量的参数?


*没有例外的规则.没有语言C/C++,但是,这两个问题都可以解答

*注意:最初给出的答案如何输出printf函数可以输出数字中的可变参数?,但它似乎不适用于提问者

c c++ variadic-functions

56
推荐指数
2
解决办法
5342
查看次数

GCC是否错误处理指向传递给函数的va_list的指针?

问题'传递va_list或指向va_list的指针?' 有一个答案引用标准(ISO/IEC 9899:1999 - §7.15'变量论点<stdarg.h>,脚注212)明确地说:

允许创建指向a的指针va_list并将该指针传递给另一个函数,在这种情况下,原始函数可以在另一个函数返回后进一步使用原始列表.

我正在编译一些代码,可以通过以下示例(真正的代码非常复杂,原始函数比这里显示的工作要多得多).

vap.c

#include <stdarg.h>
#include <stdio.h>

static void test_ptr(const char *fmt, va_list *argp)
{
    int x;
    x = va_arg(*argp, int);
    printf(fmt, x);
}

static void test_val(const char *fmt, va_list args)
{
    test_ptr(fmt, &args);
}

static void test(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);   /* First use */
    test_val(fmt, args);
    va_end(args);
    va_start(args, fmt);   /* Second use */
    test_ptr(fmt, &args);
    va_end(args);
}

int main(void)
{
    test("%d", 3);
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c variadic-functions

25
推荐指数
3
解决办法
8972
查看次数

将va_list或指针传递给va_list?

假设我有一个函数,它接受可变参数(...)或va_list从另一个这样的函数传递.主要逻辑是在这个函数本身(让我们调用它f1),但我想让它传递va_list给另一个函数(让我们调用它f2),它将确定下一个参数类型,使用它va_arg,并正确转换并存储它为呼叫者使用.

是否足以将va_list传递给f2,或者是否需要将指针传递给va_list.除非va_list需要是数组类型或者将其位置数据存储在va_list对象指向的位置(而不是在对象本身中),否则我无法看到如何通过值传递它可以允许调用函数(f1)为'看'被调用函数所做的更改va_arg.

任何人都可以阐明这一点吗?我对标准要求的内容感兴趣,而不是某些特定实现允许的内容.

c

20
推荐指数
1
解决办法
1万
查看次数

va_list 参数实际上不是 va_list

尝试编译此代码时

#include <stdarg.h>

void bar_ptr(int n, va_list *pvl) {
    // do va_arg stuff here
}

void bar(int n, va_list vl) {
    va_list *pvl = &vl; // error here
    bar_ptr(n, pvl);
}

void foo(int n, ...) {
    va_list vl;
    va_list *pvl = &vl; // fine here
    va_start(vl, n);
    bar(n, vl);
    va_end(vl);
}

int main() {
    foo(3, 1, 2, 3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC 编译器会initialization from incompatible pointer typebar函数中打印一条警告。相同的语句在foo.

似乎 type 的 agument 的类型va_list不是 …

c variadic-functions

8
推荐指数
1
解决办法
199
查看次数

把一个va_list变量放在......变量参数列表(!)中

我想设计一个函数,它接受可变数量的参数,其中一个参数本身就是一个va_list; 但我的代码出了问题,我不明白...

警告 - 我的问题不是设计代码做我想做的事情(我找到了绕过问题的方法),而只是关于理解我做错了什么......

为了解释我的问题,让我们从一个简单的例子开始:即一个函数ffprintf,它的作用类似于fprintf,但将其内容写入多个字符串,其编号由第一个参数表示的字符串,ffprintf其身份由下一个参数给出(这些参数的数量可能因调用而异,因此您必须使用变量参数列表).这样的函数将使用如下:

FILE *stream0, *stream1, *stream2;
int a, b;
ffprintf (3, stream0, stream1, stream2, "%d divided by %d worths %f", a, b, (double)a / b);
Run Code Online (Sandbox Code Playgroud)

它的代码是:

void ffprintf (int z, ...)
 {va_list vlist, auxvlist;
  FILE **streams = malloc (z * sizeof(FILE *));
  va_start (vlist, z);
  for (int i = 0; i < z; ++i)
   {streams[i] = va_arg (vlist, FILE *); // Getting the next stream argument
   }
  char …
Run Code Online (Sandbox Code Playgroud)

c variadic-functions

6
推荐指数
1
解决办法
1189
查看次数

vprintf是如何实现的?

如果想在C中编写一个函数,将一个变量参数列表传递给printf一个必须使用该vprintf版本的函数.如何为自定义函数实现此机制?

换句话说,如何是什么套的精髓vprintf除了printf在符合标准的C语言实现?

c variadic-functions

1
推荐指数
1
解决办法
3434
查看次数

标签 统计

c ×6

variadic-functions ×5

c++ ×1