void fun2(char *format, ...){
va_list arg_list;
va_start(arg_list, format);
vprintf(format, arg_list);
va_end(arg_list);
}
void fun1(char *format, ...){
fun2(format);
}
int main(){
fun1("test: %d", 100);
}
Run Code Online (Sandbox Code Playgroud)
输出:
测试:100
https://onlinegdb.com/OfdDeSJg_
上面的例子有什么错误或者不推荐的地方吗?
我猜想当调用时,只传递了fun2(format);指向第一个参数()的指针,这是正确的吗?format
当vprintfinfun2访问整数100时,这个整数在哪里?在为 保留的堆栈中fun1,在为 保留的堆栈中fun2,在为 保留的堆栈中vprintf,还是在其他地方?
如果正如我想象的那样,仅将指向第一个参数的指针传递给fun2,这是否意味着当通过fun2访问整数 100 调用的函数和宏时,它们正在访问为 保留的堆栈fun1?
我们都知道函数中有一个collapse参数paste()。它指的是一个可选的字符串来分隔结果:
paste(1:5, collapse = ", ")
[1] "1, 2, 3, 4, 5"
Run Code Online (Sandbox Code Playgroud)
但是,当collapse参数拼写错误时 - 例如cpllapse- 调用不会出错,尽管结果令人困惑:
paste(1:5, cpllapse = ", ")
[1] "1 , " "2 , " "3 , " "4 , " "5 , "
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索了cpllapseR 中的参数,但找不到任何东西。
为什么使用拼写错误的参数时不会paste()出错?如何解释结果?或者实际上有一个cpllapse参数paste()?
我正在寻找一个替换fprintf的函数
int fprintf ( FILE * stream, const char * format, ... );
Run Code Online (Sandbox Code Playgroud)
我不确定如何定义这样的函数,因为在format参数之后,此函数采用可变数量的参数.具体来说,它至少需要与格式中指定的一样多的附加参数.
更新我发现了一个关于这个主题的资源(http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html),但是这个例子似乎没有在我正在使用的操作系统Linux下编译.
替换fprintf的一个例子就是调用fprintf会有所帮助.
这不是功课.我只是一个试图学习如何在空闲时间编程的初学者.谢谢!
1)为什么/* test1 */块下的代码不打印任何东西,但是/* test2 */打印的代码是否正确?
2)如何va_arg(va, char*)在/* test 1 */代码块中使用.
void rdfDBG(int dbglevel, const char *fmt, ...) {
va_list va;
#if 1 /* test 1 */
char* logbuf;
if ((logbuf = calloc(0x0, LOGBUFFERSIZE))== NULL)
fprintf(stderr, "out of memory\n"); /* 1. Is there a better way instead of using fprintf? */
va_start(va, fmt);
(void) vsnprintf(logbuf, strlen(logbuf), fmt, va); /* 2. print nothing */
va_end(va);
free(logbuf);
#endif
#if 0 /* test 2 */
va_start(va, …Run Code Online (Sandbox Code Playgroud) 以下是我用MultiParamTypeClasses表达的内容:
class ListResultMult r a where
lstM :: a -> [a] -> r
listM :: ListResultMult r a => a -> r
listM a = lstM a []
instance ListResultMult r a => ListResultMult (a -> r) a where
lstM a as x = lstM x $ a:as
instance ListResultMult [a] a where
lstM a as = reverse $ a:as
instance Show a => ListResultMult (IO ()) a where
lstM a as = print . reverse $ a:as
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的,使用TypeFamilies(TypeSynonymInstances没有帮助):
class …Run Code Online (Sandbox Code Playgroud) Antescript:我知道有一个先前的SO问题,其标题听起来像是指完全相同的问题.它没有.
无论如何,这个问题是一个有点怪异 - 有很多更好的办法来解决这里的问题,但我很好奇,我怎么能解决我的特殊困境.
假设我有一个使用varargs接受任意数量元素的方法,可能是类型Integer.如果我有一个任意长度的整数数组,有没有办法让我用一个由所述数组的每个元素组成的逗号分隔的参数列表来调用我的方法?
这是一个简短的,人为的例子:
Integer[] paramList = new Integer {1, 2, 3};
varMethod(paramList[0], paramList[1], paramList[2]);
// varMethod({{for (param : paramList) {param;}}});
public void varMethod(Integer...values) {
for (Integer value : values) {
foo(value);
}
}
Run Code Online (Sandbox Code Playgroud)
这条注释掉的线条暗示了我想做的事情.由于paramList整数是任意长度,因此varMethod使用显式请求的每个元素(第2行)调用将不起作用.我想知道的是,是否有一种方法可以从数组元素动态生成逗号分隔的参数列表.
我再次意识到,在这样的例子中,有更好的方法可以解决整个问题,但请注意我已经简化了代码,因此它只与我们在这里讨论的特定问题相关.解决我发布的代码的任何变通办法都不会归结为我正在努力解决的问题,这导致我首先提出这个问题.
我正在使用eric4及其绳索插件来重构一些代码.我有很多方法,其签名使用*args和**kwargs语法.我想更改这些签名删除此参数.
我尝试过使用Refactoring>Refactoring>Change Method Signature但不会删除*args和**kwargs参数.
我想知道这是否是绳索本身的限制,或者它是否是eric的插件不支持此功能.
我正在寻找答案,但我找不到任何相关的信息.我们举个例子:
class MyClass
{
//member functions and variables
};
void foo(int pivot,...)
{
va_list arguments;
va_start(arguments,pivot);
//va_arg(arguments,???)
va_end(arguments);
}
void bar()
{
MyClass a;
MyClass * b = &a;
const MyClass & c = a;
foo(0,a,b,c);
}
Run Code Online (Sandbox Code Playgroud)
争论如何a,b并c通过?通过价值或参考以及如何使用va_arg来询问它们?那么MyClass的构造函数/析构函数呢?在c ++标准中指定了哪种行为?
我正在学习如何使用宏但现在与一个混淆.
我正在尝试创建一个NSString将每个params彼此附加的连接.
例如:concatOP(@"hey",@"Jude",@"Don't")将返回一个NSString包含:@"heyJudeDon't"
我实际上做了一些代码(这里也有一些代码)可以得到params的数量,但是我没有成功完成工作的第二部分.
#define NUMARGS(...) ( sizeof((int[]){__VA_ARGS__}) / sizeof(int) )
#define concatOP(...) NSMutableString *format = [[NSMutableString alloc] init];\
for( int i = 0; i < NUMARGS(__VA_ARGS__); i++){\
[format appendString:@"%@"];}\
[[NSString alloc] initWithFormat:format, __VA_ARGS__]
Run Code Online (Sandbox Code Playgroud)
我实际上遇到了很多错误,告诉我格式不存在或者我错过了一些";" 或其他结束标签.
objective-c variadic-functions ios c-preprocessor variadic-macros
编辑:我现在已经#include <stdarg.h>编译了 - 但varargs没有通过.有什么想法吗?
我有这段代码(摘录):
void msg(char* message, ...) {
va_list args;
va_start(args, message);
char* m;
if(asprintf(&m, message, args)==-1) m = message;
va_end(args);
print("<fg:green>INFO:</fg> ");
println(m);
}
Run Code Online (Sandbox Code Playgroud)
(print并且printf是执行颜色标记的包装器)
我的想法是将varargs传递给asprintf.
但是,它不编译:
gcc -g -Wall -std=gnu99 -O2 -Wfatal-errors -c -o src/ui.o src/ui.c
src/ui.c: In function ‘msg’:
src/ui.c:7:5: warning: implicit declaration of function ‘va_start’ [-Wimplicit-function-declaration]
src/ui.c:12:5: warning: implicit declaration of function ‘va_end’ [-Wimplicit-function-declaration]
Run Code Online (Sandbox Code Playgroud)
我必须包括一些特别的东西来获得va_start()和va_end()?
GCC(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3 Xubuntu 12.04
c ×4
parameters ×2
arguments ×1
arrays ×1
c++ ×1
gcc ×1
haskell ×1
ios ×1
java ×1
linux ×1
objective-c ×1
printf ×1
python ×1
r ×1
refactoring ×1
rope ×1
signature ×1
stack ×1
stack-frame ×1
variadic ×1