相关疑难解决方法(0)

在C和C++中调用函数时,EAX寄存器初始化的差异

当编译为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寄存器归零.

c c++ assembly x86-64

23
推荐指数
2
解决办法
826
查看次数

是否可以在C中具有可变参数函数且没有非可变参数?

我有以下功能:

void doStuff(int unusedParameter, ...)
{
    va_list params;
    va_start(params, unusedParameter);
    /* ... */
    va_end(params);
}
Run Code Online (Sandbox Code Playgroud)

作为重构的一部分,我想删除未使用的参数,而不另行更改函数的实现.据我所知,va_start当你没有最后一个非变量参数引用时,就不可能使用它.有没有办法解决?

背景:它实际上是一个C++程序,所以我可以使用这里建议的一些运算符重载魔法,但我希望此时不必更改接口.

现有函数通过要求变量参数列表以空值终止并扫描NULL来完成其工作,因此它不需要一个前导参数来告诉它有多少参数.

在回应评论:我不具备删除未使用的参数,但我会做到这一点,如果有一个干净的方式来做到这一点.我希望有一些我想念的简单.

c variadic-functions

16
推荐指数
2
解决办法
2694
查看次数

标签 统计

c ×2

assembly ×1

c++ ×1

variadic-functions ×1

x86-64 ×1