所有,
我正在编写一个小型的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
我刚刚阅读了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函数?
我想编写一个简单的日志函数,它接受任意数量的参数并将它们输出到控制台.用法示例:
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)
有帮助吗?谢谢
我需要让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)
我收到这个错误
错误:等号左侧的表达式不是赋值的有效目标.
我如何获得这些多输出?我不希望他们打印; 我需要在进一步的计算中使用输出.
用普通数组做这样的事情:
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 的可变参数不起作用。
我正在尝试打印参数变量类型字符串,但我一直坚持这个
尝试_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)
int ps(const char* _Str, ...)
{
int i = 0;
//char* …Run Code Online (Sandbox Code Playgroud) 根据这个答案,传递给可变函数的数字常量总是被视为int适合于一个.这让我想知道为什么以下代码适用于int和long 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 …
鉴于我们有一个这样的方法,我们希望尽可能快和内存高效。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) 在 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)
我该如何解决这个设计问题?我尝试过可变参数模板,但似乎无法使我的实现正常工作(编译但由于右值引用问题而无法链接)。
标题几乎完全涵盖了我的问题。对于某些上下文 - 从各种来源我知道可变参数函数应该有签名,其中第一个参数提供有关传递了多少参数的信息,但是在玩弄它之后我发现它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作为参数传递,这是一个有效的假设吗?我找不到这个列表应该是空终止的,但也找不到相反的。