相关疑难解决方法(0)

snprintf和Visual Studio 2010

我很遗憾被迫使用VS 2010进行项目,并注意到以下代码仍然不使用非标准兼容编译器构建:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    char buffer[512];

    snprintf(buffer, sizeof(buffer), "SomeString");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(编译错误:C3861:'snprintf':找不到标识符)

我记得这是VS 2005的情况,我很震惊地看到它还没有被修复.

有没有人知道微软是否有计划将他们的标准C库迁移到2010年?

c visual-studio-2010

100
推荐指数
4
解决办法
8万
查看次数

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作为参数传递给另一个参数

我正在使用fastcgi库创建一个应用程序,他们的打印方法有点冗长.我正在尝试用自己的方法包装他们的fprintf函数:

我想转

FCGX_FPrintF(out,char*fmt,...);

write(char*strFormat,...);

我找到了va_list的魔力但找不到将va_list值传递到fprintf函数的简单方法.有没有办法做到这一点?我知道vsprintf和vprintf存在,所以它必须比我想象的更难.

如果所有其他方法都失败了,我只会重载一个写函数

c++ fastcgi variadic-functions

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

C varargs - va_copy问题

我在C中编写一个函数,它接受可变数量的参数.

size_t myprintf(char *fmt, ...);
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我已经决定最好做Right Way™并制作一个带有可变参数的版本,另一个版本需要一个va_list.

size_t myprintf(char *fmt, ...);
size_t myvprintf(char *fmt, va_list args);
Run Code Online (Sandbox Code Playgroud)

没那么难.除了my_vprintf()需要将其发送args到两个不同的功能(首先snprintf()是长度为0以确定我们需要多少空间,然后到sprintf()我们分配了那么多空间之后).我这样做va_copy.

size_t myvprintf(char *fmt, va_list args)
{
    va_list args2;
    va_copy(args, args2);
    // do stuff with args2
    va_end(args2);
    // do more stuff with args
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好,花花公子,但C99实施得有点糟糕.我希望,如果可能的话,我的代码也可以在C89中工作,并且可以与尽可能多的编译器和尽可能多的平台一起工作.我现在有这个,#include <stddef.h>但在任何代码之前:

#ifndef va_copy
# ifdef __va_copy
#  define va_copy(a,b) __va_copy(a,b)
# else /* !__va_copy */
#  define va_copy(a,b) ((a)=(b))
# endif /* __va_copy */
#endif …
Run Code Online (Sandbox Code Playgroud)

c variadic-functions

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

标签 统计

c ×4

variadic-functions ×3

c++ ×1

fastcgi ×1

visual-studio-2010 ×1