这个问题是关于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++的问题).
我想编写一个返回类型为va_list的函数.
例: va_list MyFunc(va_list args);
这是安全和便携的吗?
我们使用了一些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]类型不是未经检查的类型.
我错过了什么吗?
我有一些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的数组,并将所有项目复制到新数组.但也许存在一种更简单的方法?
在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)
有谁知道是什么问题?
是否可以格式化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) 假设我有一个DLL导出具有可变参数列表的函数,如下所示:
int myfunc(int arg1,...)
Run Code Online (Sandbox Code Playgroud)
这里"......"是一个未定义的附加参数.可以从Visual Basic应用程序中调用此类函数,还是将VB锁定到具有固定参数的函数?
我只是要求避免一个会阻止VB程序员的设计问题......
谢谢!
当我尝试制作一个可变的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) 看到这段代码的输出我感到很惊讶:
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) 我正在尝试编写一个可变参数模板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)