标签: variadic-functions

c ++ va_arg类型转换问题

所有,

我正在编写一个小型的c ++应用程序并且被这个问题困扰了.如果不期望元素类型,有没有办法在使用va_arg从va_list宏访问元素时创建(以及稍后捕获)错误.例如:-

count=va_arg(argp,int); 
if (count <= 0 || count > 30)
{   
      reportParamError();   return;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我传递的是typedef而不是int,我会在MS编译器上获得垃圾值,但95%的时间计数在gcc上获得值0(在64位sles10 sys上).有没有办法可以执行一些类型检查,以便我得到一个可以在catch块中捕获的错误?

任何有关这方面的想法对我都非常有帮助.或者有更好的方法来做到这一点.功能原型是: -

 void process(App_Context * pActx, ...) 
Run Code Online (Sandbox Code Playgroud)

该函数被称为

 process(pAtctx,3,type1,type2,type3);
Run Code Online (Sandbox Code Playgroud)

pActx必须作为第一个参数传递,因此不能将计数作为第一个参数传递.


更新1

好吧,这听起来很奇怪,但是在sles10 gcc上,nargs似乎不属于va_list.我不得不投入

#ifdef _WIN32
tempCount=va_arg(argp,int)
#endif
Run Code Online (Sandbox Code Playgroud)

使用它之后,下面的参数不会得到垃圾值.但是,这引入了基于编译器/平台的#ifdefs ....感谢Chris和Kristopher

c++ variadic-functions

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

在struct.pack中使用*args

我刚刚阅读了python中的*args和**kwargs表示法,并决定将它与我使用struct.pack的函数一起使用:

def pack_floats(*args):

   return struct.pack('%df' %len(args), args)

但是,当然,它不起作用,因为args是一个元组.如果我想要打包三个号码,我会打电话给这个号码

struct.pack('3f', 1, 2, 3)

或者,我可以通过循环运行它并一次打包一个数字,但我不知道一次一个值与一次所有值之间是否存在任何性能差异.

有没有办法编写pack_floats函数而不在循环中调用pack函数?

python function variadic-functions

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

变量函数:表达式包含未展开的参数包'args'

我想编写一个简单的日志函数,它接受任意数量的参数并将它们输出到控制台.用法示例:

LOG("hello");
LOG("hello", 1, 0.6);
Run Code Online (Sandbox Code Playgroud)

我开始像这样实现它

template<typename... Args>
void LOG(Args... args) {
    va_list vargs;
    va_start(vargs, args);
    // for (auto arg: vargs) {}
}
Run Code Online (Sandbox Code Playgroud)

但是编译器(clang ++)给了我标题中的错误

expression contains unexpanded parameter pack 'args'
Run Code Online (Sandbox Code Playgroud)

有帮助吗?谢谢

c++ templates variadic-functions c++11

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

多个不同大小的输出功能?

我需要让MATLAB返回不同大小的多个输出,即一个是n乘m矩阵,另一个是矢量

function output = name(arg1,arg2,...,argn)

    blabla

    output = {A;B};

end
Run Code Online (Sandbox Code Playgroud)

当我输入

{A;B}=name(arg1,arg2,...,argn)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

错误:等号左侧的表达式不是赋值的有效目标.

我如何获得这些多输出?我不希望他们打印; 我需要在进一步的计算中使用输出.

matlab variadic-functions output

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

Java 将 Map 传递给一对可变参数

用普通数组做这样的事情:

public class TestVarArgs {
    public static void main(String[] args) {
        int[] array = new int[4];
        for (int i = 0; i < array.length; i++) {
            System.out.println(i);
        }
        testThis(array);
    }
    public static void testThis(int... args) {
        for (int i = 0; i < args.length; i++) {
            System.out.println(i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我怎样才能用地图做到这一点?

我想将映射传递给接收可变参数对的方法。

将 Map 传递给 Entry.Map 的可变参数不起作用。

java dictionary variadic-functions

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

使用带有可变参数的函数(va_list)打印字符串

我正在尝试打印参数变量类型字符串,但我一直坚持这个

想法

尝试_Str[i]在 while 循环中使用as 表达式在srting 内部移动,并且一旦_Str[i] == '\0'返回(-1)定义为EOF之后我们测试'\n' == EOF返回EOF。比切换到下一个变量

编码

主文件

int main(int argc, char** argv)
{ 
    ps("test1", "test2");
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

基数

#ifndef BASE_H_
 #define BASE_H_
  #ifndef EOF // (EOF) - End Of File character. (-1)
   #define EOF (-1)
  #endif// EOF 
 #include<stdio.h>// Facultatif  
 #include<stdarg.h> 

    int ps(const char* , ...); // our function


#endif // BASE_H_
Run Code Online (Sandbox Code Playgroud)

基地.c

int ps(const char* _Str, ...)
{
    int  i = 0;

    //char* …
Run Code Online (Sandbox Code Playgroud)

c string pointers variadic-functions

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

为什么我的可变参数函数同时使用int和long long?

根据这个答案,传递给可变函数的数字常量总是被视为int适合于一个.这让我想知道为什么以下代码适用于intlong long.考虑以下函数调用:

testfunc(4, 1000, 1001, 1002, 1003);
Run Code Online (Sandbox Code Playgroud)

testfunc 看起来像这样:

void testfunc(int n, ...)
{
    int k;
    va_list marker;

    va_start(marker, n);
    for(k = 0; k < n; k++) {
        int x = va_arg(marker, int);
        printf("%d\n", x);
    }
    va_end(marker); 
}
Run Code Online (Sandbox Code Playgroud)

这很好用.它打印1000,1001,1002,1003.但令我惊讶的是,以下代码也可以:

void testfunc(int n, ...)
{
    int k;
    va_list marker;

    va_start(marker, n);
    for(k = 0; k < n; k++) {
        long long x = va_arg(marker, long long);
        printf("%lld\n", x);
    }
    va_end(marker); 
}
Run Code Online (Sandbox Code Playgroud)

这是为什么?为什么它也适用long …

c variadic-functions

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

JVM 足够聪明来优化可变参数数组?

鉴于我们有一个这样的方法,我们希望尽可能快和内存高效。JVM 是否可能足够聪明,可以将其优化为简单的字符串构建器附加,并避免为可变参数创建 Object[] 并避免将原语自动装箱到该对象数组的 Object 中?

protected String stringId(Object... things) {
    final StringBuilder sb = new StringBuilder();

    for (Object thing : things) {
        if(sb.length() > 0) {
            sb.append('-');
        }
        sb.append(String.valueOf(thing));
    }

    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

java performance jit jvm variadic-functions

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

如何实现可变参数模式以将可变数量的参数转发给 C++11 中的函数?

在 python 中,我可以使用*args允许可变数量的输入到函数中。例如,以下代码段将打印出调用 f 时传递的所有参数:

def f(*args):
  for a in args:
    print(a)
Run Code Online (Sandbox Code Playgroud)

我希望能够在具有以下要求的 C++11 中实现这样的模式:

函数 f 将始终接受特定类型 T 的值,然后是可变数量的输入;这可能包括 0 个额外的输入。

额外的输入不一定是相同的类型,所以使用初始化列表是行不通的。

函数 f 将被另一个函数 g 调用,该函数需要将可选参数转发给 f:

T g(const T& x, args...) {
  T output = f(x, args...);
  return output;
};

T f(const T& x, args...) {
  // do some stuff and return an object of type T
};
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个设计问题?我尝试过可变参数模板,但似乎无法使我的实现正常工作(编译但由于右值引用问题而无法链接)。

c++ templates variadic-functions c++11

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

可变参数列表是否以空值结尾?

标题几乎完全涵盖了我的问题。对于某些上下文 - 从各种来源我知道可变参数函数应该有签名,其中第一个参数提供有关传递了多少参数的信息,但是在玩弄它之后我发现它vs_arg总是nullptr在最后一个参数之后立即返回所以这段代码效果很好(使用 MS Visual Studio):

void func(MClass *t_instance...) {
    std::va_list arguments;
    va_start(arguments, t_instance);
    for (MClass *instance = t_instance; instance != nullptr; instance = va_arg(arguments, MClass *)) {
        std::out << instance->name << std::endl;
    }
    va_end(arguments);
}
Run Code Online (Sandbox Code Playgroud)

当然,如果没有nullptr作为参数传递,这是一个有效的假设吗?我找不到这个列表应该是空终止的,但也找不到相反的。

c++ variadic-functions

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