当编译为C程序或C++程序(对于Linux x86-64)时,小程序的程序集之间存在奇怪的差异.
有问题的代码:
int fun();
int main(){
return fun();
}
Run Code Online (Sandbox Code Playgroud)
将其编译为C程序(带gcc -O2)产生:
main:
xorl %eax, %eax
jmp fun
Run Code Online (Sandbox Code Playgroud)
但将其编译为C++ - 程序(带g++ -02)产生:
main:
jmp _Z3funv
Run Code Online (Sandbox Code Playgroud)
我觉得很困惑,C版本用0(xorl %eax, %eax)初始化主函数的返回值.
C语言的哪个特性对这种必要性负责?
编辑:确实,因为int fun(void);没有初始化eax寄存器.
如果根本没有原型fun,即:
int main(){
return fun();
}
Run Code Online (Sandbox Code Playgroud)
然后C编译器再次将eax寄存器归零.
我有以下功能:
void doStuff(int unusedParameter, ...)
{
va_list params;
va_start(params, unusedParameter);
/* ... */
va_end(params);
}
Run Code Online (Sandbox Code Playgroud)
作为重构的一部分,我想删除未使用的参数,而不另行更改函数的实现.据我所知,va_start当你没有最后一个非变量参数引用时,就不可能使用它.有没有办法解决?
背景:它实际上是一个C++程序,所以我可以使用这里建议的一些运算符重载魔法,但我希望此时不必更改接口.
现有函数通过要求变量参数列表以空值终止并扫描NULL来完成其工作,因此它不需要一个前导参数来告诉它有多少参数.
在回应评论:我不具备删除未使用的参数,但我会做到这一点,如果有一个干净的方式来做到这一点.我希望有一些我想念的简单.