我正在尝试编写一个接受可变数量参数的函数,比如printf,做一些事情,然后将变量列表传递给printf.我不知道如何做到这一点,因为它似乎必须将它们推入堆栈.
大概是这样的东西
#include <stdio.h>
#include <stdarg.h>
void forward_args( const char *format , ... ){
va_list arglist;
printf( format, arglist );
}
int main (int argc, char const *argv[]){
forward_args( "%s %s\n" , "hello" , "world" ); return 0;
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
看起来很简单,我想用一组参数调用一个函数.当然,我可以说,func.apply(this, ['some', 'arguments']);但这将改变this内部的价值func.知道怎么做而不改变它吗?
以下在Python中运行得非常好:
def f(x,y,z): return [x,y,z]
a=[1,2]
f(3,*a)
Run Code Online (Sandbox Code Playgroud)
a获取解压缩的元素,就好像你已经调用它f(3,1,2)并返回它一样[3,1,2].精彩!
但我不能解开的元素a到第一个两个参数:
f(*a,3)
Run Code Online (Sandbox Code Playgroud)
f(1,2,3)我没有调用那样,而是"SyntaxError:只有命名参数才能跟*表达式".
我只是想知道为什么它必须是这样的,如果有任何聪明的技巧我可能不会意识到将数组解压缩到参数列表的任意部分而不诉诸临时变量.
在C中,getopt_long不会解析命令行参数参数的可选参数.
当我运行程序时,无法识别可选参数,如下面的示例运行.
$ ./respond --praise John
Kudos to John
$ ./respond --blame John
You suck !
$ ./respond --blame
You suck !
Run Code Online (Sandbox Code Playgroud)
这是测试代码.
#include <stdio.h>
#include <getopt.h>
int main(int argc, char ** argv )
{
int getopt_ret, option_index;
static struct option long_options[] = {
{"praise", required_argument, 0, 'p'},
{"blame", optional_argument, 0, 'b'},
{0, 0, 0, 0} };
while (1) {
getopt_ret = getopt_long( argc, argv, "p:b::",
long_options, &option_index);
if (getopt_ret == -1) break;
switch(getopt_ret)
{
case 0: break;
case 'p': …Run Code Online (Sandbox Code Playgroud) 如何将参数名称及其值作为字典传递给方法?
我想为GET请求指定可选和必需的参数作为HTTP API的一部分,以便构建URL.我不确定制作这种pythonic的最佳方法.
是否可以在函数参数列表中使用先前的参数作为参数列表中后续参数的默认值?例如,
void f( int a, int b = a, int c = b );
Run Code Online (Sandbox Code Playgroud)
如果可以,有任何使用规则吗?
我想在另一个线程的主线程上执行一个选择器,但是选择器有多个参数,类似于:
-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e {
//...
}
我怎样才能使用它performSelectorOnMainThread: withObject: waitUntilDone:?
编辑
我想解释一下为什么我需要这个.
我在主线程上使用UIImageViews,并在另一个线程上对它们进行计算.我使用了很多计算,所以如果我在主线程上创建所有内容,那么应用程序就会滞后.我知道UI元素只能在主线程上操作,这就是为什么我希望它以这种方式工作,所以主线程可以听到没有滞后的触摸事件.
我有一个场景,我有一个接口,有一个像这样的方法:
interface SomeInterface
{
SomeMethod(arg1: string, arg2: string, arg3: boolean);
}
Run Code Online (Sandbox Code Playgroud)
像这样的一个类:
class SomeImplementation implements SomeInterface
{
public SomeMethod(arg1: string, arg2: string, arg3: boolean = true){...}
}
Run Code Online (Sandbox Code Playgroud)
现在问题是我似乎无法告诉接口第3个选项应该是可选的还是有一个默认值,就像我试图告诉接口有一个默认值我得到错误:
TS2174: Default arguments are not allowed in an overload parameter.
如果我从界面中省略默认值并像这样调用它:
var myObject = new SomeImplementation();
myObject.SomeMethod("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
它抱怨参数与任何覆盖都不匹配.那么是否有一种方法可以为参数提供默认值并从接口继承,我不介意接口是否必须将值作为默认值,因为它始终是一个可选参数.
为什么这不起作用?
package main
import "fmt"
type name struct {
X string
}
func main() {
var a [3]name
a[0] = name{"Abbed"}
a[1] = name{"Ahmad"}
a[2] = name{"Ghassan"}
nameReader(a)
}
func nameReader(array []name) {
for i := 0; i < len(array); i++ {
fmt.Println(array[i].X)
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
.\structtest.go:15: cannot use a (type [3]name) as type []name in function argument
Run Code Online (Sandbox Code Playgroud) arguments ×10
arrays ×2
c ×2
function ×2
python ×2
apply ×1
c++ ×1
dictionary ×1
forward ×1
getopt ×1
getopt-long ×1
go ×1
interface ×1
ios ×1
java ×1
javascript ×1
objective-c ×1
parameters ×1
printf ×1
typescript ×1
variables ×1