变量函数和va_arg:变量化要打印的类型

时间:2016-01-04 19:36:03

标签: c variadic-functions

我正在尝试重新编码printf函数,因此我需要使用va_arg,因为printf是一个可变函数。

问题是,当我想打印my_printf的论点时,它们可以是%iint)或%schar *)如果我们采取这两种基本的可能性。

因此,当我浏览va_list ap时,我尝试在va_arg函数中放置一个变量,以便我可以更改要写入的类型,如下所示:

char *str = NULL;
str = ft_set_my_types(flags[cur_arg]);          
ft_putstr(va_arg(ap, str));

我的函数ft_set_my_types类似于:

char *ft_set_my_types(char *flags)
{
    char **tab = NULL;

    tab = ft_alloc_mem2(2, 15); /* this function malloc a tab */
    char a = 65;

     /* the example here is only with two types of variables */
     /* I am sending flags %s in my example which correspond to "char *" */

    tab['s'] = "char *";
    tab['d'] = "int ";

    size_t len = ft_strlen(flags) - 1;
    while (a < 123)
    {
        if (a == flags[len])
            break ;
        else
            a++;
    }
    return (tab[a]);
}

&#34; char *标志&#34;成为&#34;%&#34;之间的一切以及my_printf的标志(包括在内)。

问题是:当我编译它时,我不知道我的标签[&#39; s&#39;]为char *,而是&#34; char *&#34;所以我收到了这个错误:

ft_print.c:63:25: error: unknown type name 'str'
                        ft_putstr(va_arg(ap, str));
                                             ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include/stdarg.h:35:50: note:
      expanded from macro 'va_arg'
#define va_arg(ap, type)    __builtin_va_arg(ap, type)
1 error generated.

您能否帮我弄清楚如何在*str函数中插入变量va_arg

1 个答案:

答案 0 :(得分:5)

C是静态类型的。所有数据类型都在编译时确定。您无法通过调用函数来获取声明的数据类型。

相反,要处理在运行时之前未知类型的可变参数,必须通过<input type="text" ng-model="scopeProp" save-on-blur="save()"> 语句或switch / if /基于所选数据类型进行分支。 else if巢。在每个替代方案中,使用else宏来获取参数,并使用该替代方法处理适当的静态类型。如果愿意,您可以在辅助函数中执行特定于类型的处理。

例如,

va_arg

注意/* ... */ switch (field_code) { case 'i': do_something_with_int(va_arg(ap, int)); break; case 's': do_something_with_string(va_arg(ap, char *)); break; default: handle_error(); break; } /* ... */ 的第二个参数是类型本身,而不是它的字符串表示。