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

2024-06-30

考虑:

#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;
}

In the toUpper函数,返回类型为char,但没有任何“回报”到上层()。并用gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)编译源代码,Fedora https://en.wikipedia.org/wiki/Fedora_Linux 14.

当然,会发出警告:“警告:控制到达非空函数的末尾”,但是运行良好。

使用 gcc 编译期间该代码发生了什么?


当 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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC 为什么以及如何编译缺少 return 语句的函数? 的相关文章

  • C# 泛型方法,new() 构造函数约束中的类型参数

    有没有办法创建一个使用的通用方法new 要求类具有特定类型的构造函数属性的约束 例如 我有以下代码 public T MyGenericMethod
  • C# 中线程之间发送消息

    如何在线程之间发送和接收消息 例如 一种解决方案是共享并发队列 尽管它的名称 并发队列 http msdn microsoft com en us library dd267265 aspx 这将允许您将一个对象从一个线程入队 并让另一个线
  • 使用 解释 gprof 输出

    我试图在我的程序中找到性能问题 从而通过分析来检测代码 gprof 创建一个如下所示的平面配置文件 Flat profile Each sample counts as 0 01 seconds cumulative self self t
  • 画笔和钢笔使用指南

    制作 GDI 画笔和钢笔有多贵 我应该在添加所需的基础上创建它们并将它们包装在 using 中以便快速处理它们 还是应该创建一个类似于 System Drawing Brushes 类的静态类 IMO 它们足够高效 您通常不应该创建在多个方
  • 为什么禁止在后续私有派生类中简单提及基指针/引用?

    struct B struct D private B B fun return new D ok struct DD public D B foo return 0 error struct B B B is inaccessible 这
  • 在屏幕中,如何向单个屏幕会话中的所有虚拟终端窗口发送命令? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道如何在启动时在单个屏幕会话中创建多个窗口 但是 一旦我启动并运行它们 有没有一种方法可以将我的输入发送到所有打开的窗口 而不仅仅是当
  • 如何将流写入内存流?

    public void doprocess TcpClient client MemoryStream ms new MemoryStream Stream clStream client GetStream byte buffer 1 n
  • 类内枚举前向声明是否可能? [复制]

    这个问题在这里已经有答案了 我知道在 C 11 中可以转发声明枚举类型 如果提供了存储类型 例如 enum E short void foo E e enum E short VALUE 1 VALUE 2 但我想转发声明一个类中定义的枚举
  • 在 OpenCV C++ 中使用 gpu::GpuMat

    我想知道如何修改gpu GpuMat 事实上我想知道是否可以使用gpu GpuMat like a cv Mat 我想做这样的事情 cv namedWindow Result cv Mat src host cv imread lena j
  • 从包含 n 个元素的向量中随机选择 m 个元素

    我有一个向量包含n元素 我需要选择一个子集m向量中随机出现的元素 不重复 做到这一点最有效的方法是什么 我需要在我的代码中执行此操作数千次 我想到的解决方案是使用rand 生成一个随机数k之间0 and n 然后选择k向量中的第一个元素并将
  • 为什么 C# 三元运算符不能与委托一起使用?

    当分支选择函数时 使用三元运算符来选择函数可能是有意义的 但这是不可能的 为什么 public class Demo protected bool branch protected void demo1 protected void dem
  • C++14 中专门用于数组类型的分配器?

    为什么 c 14 中没有 std allocator 的数组模板专门化 当我自己尝试专门化 std allocator 时 我在实现 Construction 和 destroy 方法时遇到了死胡同 是这个原因吗 那么为什么 std all
  • 如何在C++中从Imagemagick图像获取缓冲区

    我正在使用 ImageMagick 库进行图像处理 我需要加载 bmp 图像 将其转换为 jpeg 将其加载到缓冲区中并通过网络发送 但是 我在 ImageMagick 中找不到任何可以在缓冲区中转换和存储数据的支持函数 我只能写入文件 尝
  • 在运行的 Windows 控制台应用程序中处理拖放文件

    首先澄清一下 我是not询问如何将文件拖放到 exe 图标上 我想知道如何处理拖放到已经运行win32 控制台应用程序 我也是not询问如何通过 Windows 消息泵处理基于 WinMain 的应用程序内部的拖放 我想在带有入口点的程序内
  • 如何从源代码编译picoProlog?

    我是计算机科学专业的学生 正在学习 Prolog 逻辑编程 我发现了一个有趣的 Prolog 解释器 picoProlog http spivey oriel ox ac uk corner Logic Programming http s
  • Asp.net MVC 2 缓存

    我目前正在使用 c 中的 asp net mvc 2 开发一个网站 我从未使用过 MVC 中的缓存功能 并且想将其应用到用户个人资料页面 此页面上的内容很少更改 唯一需要实时的部分是用户最近发布的帖子列表 我使用linq to sql从数据
  • 在 OpenGL 中绘制 2D 纹理 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个绘图函数叫做DrawImage但这确实令人困惑 并且仅适用于特定形式的重塑函数 所以我有两个问题 如何在 Ope
  • 从枚举获取 DescriptionAttribute [重复]

    这个问题在这里已经有答案了 我有一个枚举 用于查找协调字符串值 其中一个枚举中有一个空格 因此我尝试使用描述属性来查找该值 在找到 DescriptionAttribute 后 我在转换回公共类时遇到问题 public class Addr
  • 如何在预处理器中检测X32 ABI或环境?

    X32是一个 ABIamd64 x86 64使用 32 位指针的 CPU 这个想法是将 x86 64 的较大寄存器集与 32 位指针产生的较小内存和缓存占用空间结合起来 它可提供高达约 40 的加速 看x86 x32 和 x64 架构之间的
  • Dapper 中的自定义映射

    我正在尝试使用带有 Dapper 和多重映射的 CTE 来获取分页结果 我遇到了重复列的不便 例如 CTE 阻止我命名列 我想将以下查询映射到以下对象 而不是列名和属性之间的不匹配 Query WITH TempSites AS SELEC

随机推荐