zoukankan      html  css  js  c++  java
  • C陷阱与缺陷(四)

    第四章 连接

    4.1 什么是连接器

    C语言中的一个重要思想就是分别编译,即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合在一起。
    典型的连接器把由编译器或汇编器生成的若干个目标模块,整合成一个被称为载入模块或可执行文件的实体,该实体能够被操作系统直接执行。
    连接器通常把目标模块看成是由一组外部对象组成的。
    连接器的输入一组目标模块和库文件,连接器的输出是一个载入模块。

    4.2 声明与定义

    下面的声明语句 int a;如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义。
    这个语句说明了a是一个外部整型变量,同时为a分配了存储空间。如果它没初始化,则默认为0.
    严格的规则是,每个外部变量只能够定义一次。

    4.3 命名冲突与static修饰符

    static是一个能够减少命名冲突的有用工具。
    例如 static int a;
    将a的作用域限制在一个源文件内,对于其它源文件,a是不可见的。
    static修饰符不仅适用于变量,也适用于函数。
    我们可以在多个源文件中定义同名的函数,只要都被定义为static,或者仅仅只有其中一个函数不是static.

    4.4 形参、实参与返回值

    如果一个函数在被定义或声明之前被调用,那么它的返回类型就默认为整型。

    4.5 检查外部类型

    假定我们有一个C程序,它由两个源文件组成。
    一个文件中包含外部变量n的声明: extern int n;
    另一个文件中包含外部变量n的定义: long n;

    当这个程序运行时,可能发生以下情况:
    一、C语言编译器能检测到冲突。
    二、两者数值在内部表示上一样,例如都是32位,程序很可能正常工作。
    三、共享存储空间,long的低端部分赋给了int类型的n,能正常工作。
    四、共享存储空间,但是对其中一个赋值掩盖了另一个值,将不能正常工作。

    注意 char filename[]=”hello"
    与引用extern char* filename;
    尽管在上下文环境中,数组与指针非常相似,但它们毕竟不同,需要进行修改。

    4.6 头文件

    每个外部对象只声明在头文件中,需要用刀该外部对象的所有模块都应该包括这个头文件。
    定义该外部对象的模块也应该包括这个头文件。

    假定一个程序在一个源文件中包含了声明: long fop;而在另一个源文件中包含了 extern short foo;
    如果给long类型的foo赋了一个较小的值37,short类型的foo同时获得一个值37.那么我们知道运行改程序的硬件是一个低位优先的机器。
    如果给long类型的foo赋了一个较小的值37,short类型的foo同时获得一个值0.那么我们知道运行改程序的硬件是一个高位优先的机器。

  • 相关阅读:
    prometheus基础概念
    Prometheus告警处理
    什么是prometheus?
    Prometheus的PromQL
    Prometheus的Exporter详解
    leetcode unique path I&&II
    leetcode Palindrome Partitioning
    leetcode 最大子矩阵(5星推荐)
    leetcode Sum Root to Leaf Numbers 二叉树所有叶节点的路径和
    leetcode Spiral Matrix I
  • 原文地址:https://www.cnblogs.com/tuifeideyouran/p/3141821.html
Copyright © 2011-2022 走看看