一尘不染

GCC为什么以及如何通过缺少return语句来编译函数?

linux

#include <stdio.h>

char toUpper(char);

int main(void)
{
    char ch, ch2;
    printf("lowercase input : ");
    ch = getchar();
    ch2 = toUpper(ch);
    printf("%c ==> %c\n", ch, ch2);

    return 0;
}

char toUpper(char c)
{
    if(c>='a'&&c<='z')
        c = c - 32;
}

在toUpper函数中,返回类型为char,但是toUpper()中没有“ return”。并使用gcc(GCC)4.5.1 20100924(Red
Hat 4.5.1-4),fedora-14编译源代码。

当然,会发出警告:“警告:控制到达非无效功能的尽头”,但是效果很好。

用gcc编译期间该代码中发生了什么?在这种情况下,我想得到一个可靠的答案。谢谢 :)


阅读 289

收藏
2020-06-02

共1个答案

一尘不染

您遇到的是,当C程序被编译为汇编语言时,您的toUpper函数最终像这样结束:

_toUpper:
LFB4:
        pushq   %rbp
LCFI3:
        movq    %rsp, %rbp
LCFI4:
        movb    %dil, -4(%rbp)
        cmpb    $96, -4(%rbp)
        jle     L8
        cmpb    $122, -4(%rbp)
        jg      L8
        movzbl  -4(%rbp), %eax
        subl    $32, %eax
        movb    %al, -4(%rbp)
L8:
        leave
        ret

在%eax寄存器中进行32的减法。在x86调用约定中,这是期望返回值的寄存器!所以…你很幸运。

但是请 注意警告。 他们在那里是有原因的!

2020-06-02