标签: variadic-functions

最后命名参数不是函数还是数组?

这个问题是关于vararg函数,以及省略号之前的最后一个命名参数:

void f(Type paramN, ...) {
  va_list ap;
  va_start(ap, paramN);
  va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)

我正在阅读C标准,并发现va_start宏的以下限制:

参数parmN是函数定义中变量参数列表中最右边参数的标识符(恰好在......之前).如果参数parmN使用寄存器存储类,函数或数组类型声明,或者使用与应用默认参数提升后生成的类型不兼容的类型,则行为未定义.

我想知道为什么以下代码的行为未定义

void f(int paramN[], ...) {
  va_list ap;
  va_start(ap, paramN);
  va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)

并且未定义以下内容

void f(int *paramN, ...) {
  va_list ap;
  va_start(ap, paramN);
  va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)

宏可以通过纯C代码实现.但纯C代码无法确定是否paramN声明为数组或指针.在这两种情况下,参数的类型都被调整为指针.功能类型参数也是如此.

我想知道:这个限制的理由是什么?在内部进行这些参数调整时,某些编译器是否存在实现此问题的问题?(C++也说明了相同的未定义行为 - 所以我的问题是关于C++的问题).

c c++ arrays variadic-functions

16
推荐指数
2
解决办法
1077
查看次数

在C中返回va_list是否安全?

我想编写一个返回类型为va_list的函数.

例: va_list MyFunc(va_list args);

这是安全和便携的吗?

c c99 variadic-functions c89

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

Java 1.7 varargs函数报告为未经检查的警告

我们使用了一些varargs函数,当我们转向java 1.7时,我们得到了一个奇怪的未经检查的警告.

功能在接口ICache中添加

public interface ICache<O> {
    void add(Object source, O... objects);
}
Run Code Online (Sandbox Code Playgroud)

在界面中报告错误.

ICache.java:18: warning: [unchecked] Possible heap pollution from parameterized vararg type O
    void add(Object source, O... objects);
  where O is a type-variable:
    O extends Object declared in interface ICache
1 warning
Run Code Online (Sandbox Code Playgroud)

O扩展了Object,作为其通用缓存类.

我阅读了xlint警告并且我们在未经检查的情况下编译,但是http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings似乎暗示这个错误应该是[varargs]类型不是未经检查的类型.

我错过了什么吗?

java javac variadic-functions java-7 heap-pollution

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

如何使用varargs方法中的附加参数调用varargs方法

我有一些varargs系统函数,其中T是一些实际类型,如String:

sys(T... args)
Run Code Online (Sandbox Code Playgroud)

我想创建自己的函数,它委托给系统函数.我的功能也是一个varargs功能.我想通过系统函数传递函数的所有参数,以及一个额外的尾随参数.像这样的东西:

myfunc(T... args) {
    T myobj = new T();
    sys(args, myobj); // <- of course, here error.
}
Run Code Online (Sandbox Code Playgroud)

如何更改错误行?现在我只看到一种方法:创建维度[args] + 1的数组,并将所有项目复制到新数组.但也许存在一种更简单的方法?

java delegates variadic-functions

16
推荐指数
2
解决办法
899
查看次数

va_list尚未声明

在Fedora 11上编译一些工作代码时,我收到此错误:

/usr/include/c++/4.4.1/cstdarg:56: error: ‘::va_list’ has not been declared
Run Code Online (Sandbox Code Playgroud)

我在用:

[doriad@davedesktop VTK]$ g++ --version
g++ (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)
Run Code Online (Sandbox Code Playgroud)

有谁知道是什么问题?

gcc compiler-errors g++ variadic-functions

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

如何使用参数集合格式化std :: string?

是否可以格式化std::string传递一组参数?

目前我正在以这种方式格式化字符串:

string helloString = "Hello %s and %s";
vector<string> tokens; //initialized vector of strings
const char* helloStringArr = helloString.c_str();
char output[1000];
sprintf_s(output, 1000, helloStringArr, tokens.at(0).c_str(), tokens.at(1).c_str());
Run Code Online (Sandbox Code Playgroud)

但是矢量的大小是在运行时确定的.是否有任何类似的函数sprintf_s采用参数集合并格式化std :: string/char*?我的开发环境是MS Visual C++ 2010 Express.

编辑: 我想实现类似的东西:

sprintf_s(output, 1000, helloStringArr, tokens);
Run Code Online (Sandbox Code Playgroud)

c++ string-formatting variadic-functions stdstring

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

使用Visual Basic的变量参数列表?

假设我有一个DLL导出具有可变参数列表的函数,如下所示:

int myfunc(int arg1,...)
Run Code Online (Sandbox Code Playgroud)

这里"......"是一个未定义的附加参数.可以从Visual Basic应用程序中调用此类函数,还是将VB锁定到具有固定参数的函数?

我只是要求避免一个会阻止VB程序员的设计问题......

谢谢!

dll vba variadic-functions

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

如何制作一个可变的lambda?

当我尝试制作一个可变的lambda:

#include <cstdarg>

int main() {
    [] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有了海湾合作委员会这个编译很好,但是clang拒绝它:

main.cpp:4:35: error: 'va_start' used in function with fixed args
    [] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
                                  ^

哪个编译器在这里正确?是否可以制作一个可变的lambda?


奇怪的是,以下结果导致了一个带有clang的ICE,所以看起来clang正在使用变量:

int f(...) {
    [] (int x, ...) { va_list xs; va_start(xs, x); va_end(xs); };
    return;
}
Run Code Online (Sandbox Code Playgroud)

c++ lambda gcc clang variadic-functions

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

使用变量参数重载的方法(varargs)

看到这段代码的输出我感到很惊讶:

public class File
{
    public static void main(String[] args)
    {
        movie();
    }

    static void movie(double... x)
    {
        System.out.println("No varargs");
    }

    static void movie(int... x)
    {
        System.out.println("One argument");
    }
}
Run Code Online (Sandbox Code Playgroud)

它输出,

One argument
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

我认为这段代码不能编译,因为调用movie()模糊的,但运行正常并输出One argument.

如果我将代码修改为:

public class File
{
    public static void main(String[] args)
    {
        movie();
    }

    static void movie(boolean... x)  //Changed the parameter type to boolean from double
    {
        System.out.println("No varargs");
    }

    static void movie(int... x)
    {
        System.out.println("One argument");
    }
} …
Run Code Online (Sandbox Code Playgroud)

java overloading variadic-functions

15
推荐指数
2
解决办法
2267
查看次数

如何编写可变参数模板的递归函数?

我正在尝试编写一个可变参数模板constexpr函数,它可以计算给定模板参数的总和.这是我的代码:

template<int First, int... Rest>
constexpr int f()
{
    return First + f<Rest...>();
}

template<int First>
constexpr int f()
{
    return First;
}

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

不幸的是,error C2668: 'f': ambiguous call to overloaded function在尝试解析f<3,>()调用时,它不会编译报告错误消息.

我还尝试将我的递归基础案例更改为接受0模板参数而不是1:

template<>
constexpr int f()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码也没有编译(消息error C2912: explicit specialization 'int f(void)' is not a specialization of a function template).

我可以提取第一个和第二个模板参数来进行编译和工作,如下所示:

template<int First, int Second, int... Rest>
constexpr int …
Run Code Online (Sandbox Code Playgroud)

c++ recursion variadic-functions variadic-templates c++11

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