C编译器忽略第二个参数

C编译器忽略第二个参数,c,C,我试图为一个库编写一个包装器,我试图让编译器在编译时忽略第二个参数(因为没有更好的短语) 我想让这种情况发生在生锈,但C也可以 作为一个例子,假设我有这个C代码 void func(int a, int b, int c) { // ... } 此程序集中的调用约定为arg0到rdi、arg1到rsi、arg2到rdx、arg3到rcx、arg4到r8、arg5到r9,其余到堆栈 我想告诉编译器把arg0放在rdi中,把arg1放在rdx中,基本上跳过rsi。这只是为了这个特殊的通话

我试图为一个库编写一个包装器,我试图让编译器在编译时忽略第二个参数(因为没有更好的短语)

我想让这种情况发生在生锈,但C也可以

作为一个例子,假设我有这个C代码

void func(int a, int b, int c) {
    // ... 
}
此程序集中的调用约定为arg0到
rdi
、arg1到
rsi
、arg2到
rdx
、arg3到
rcx
、arg4到
r8
、arg5到
r9
,其余到堆栈

我想告诉编译器把arg0放在
rdi
中,把arg1放在
rdx
中,基本上跳过
rsi
。这只是为了这个特殊的通话约定

我调用的库本质上使用第二个参数作为跳转表的偏移量,但我的包装器将在内部处理这个问题

我的代码基本上看起来像

wrapper(arg0,arg1,arg2,…)
->
api(arg1,arg1,arg2,…)


我想尝试这样做,而不必手动转换每个参数,因为API调用具有不确定的算术性,将内容转移到堆栈中可能是一个问题。另外,我正在尝试使交叉编译,因此可能不会总是使用这种特定的调用约定。

我不确定,但我会尝试在c中使用
void func(int a,int space,int b,int c){(void)space;//…}
。这是函数中未使用的变量的常用语法。@LambdaBeta允许我像
func(1,2,3)
那样调用该函数,并跳过空格吗?这是标准C语言还是编译器的扩展?这只是语言工作方式的扩展。但是,您仍然需要调用
func(1,0/*表示间距*/,2,3)
。我不确定是否有一个标准的方法来实际指定调用约定。“我从来没有真正研究过它。”兰姆达贝塔我想我是在试图做与你建议相反的事情。我的包装器函数只传递所有参数,不做任何更改,第二个参数除外,它将在运行时确定。因此,本质上我调用的是一个只有n-1个参数的n参数函数,其中第二个参数是隐含的,不需要在函数调用中指定。我认为没有标准的方法可以做到这一点。我确实编译了一个小测试文件
intfunc(inta,intspace,intb,intc){(void)space;返回a+b-c;}intmain(){returnfunc(1,0,1,1);}
并检查了程序集,它确实生成了
。。。movl$1、%ecx movl$1、%edx movl$0、%esi movl$1、%edi call func…
但您必须实际指定它。我不确定,但我会尝试在c中使用
void func(int a,int space,int b,int c){(void)space;//…}
。这是函数中未使用的变量的常用语法。@LambdaBeta允许我像
func(1,2,3)
那样调用该函数,并跳过空格吗?这是标准C语言还是编译器的扩展?这只是语言工作方式的扩展。但是,您仍然需要调用
func(1,0/*表示间距*/,2,3)
。我不确定是否有一个标准的方法来实际指定调用约定。“我从来没有真正研究过它。”兰姆达贝塔我想我是在试图做与你建议相反的事情。我的包装器函数只传递所有参数,不做任何更改,第二个参数除外,它将在运行时确定。因此,本质上我调用的是一个只有n-1个参数的n参数函数,其中第二个参数是隐含的,不需要在函数调用中指定。我认为没有标准的方法可以做到这一点。我确实编译了一个小测试文件
intfunc(inta,intspace,intb,intc){(void)space;返回a+b-c;}intmain(){returnfunc(1,0,1,1);}
并检查了程序集,它确实生成了
。。。movl$1、%ecx movl$1、%edx movl$0、%esi movl$1、%edi call func…
但您必须实际指定它。