首页 > 其他分享 >第十二天C语言自学笔记

第十二天C语言自学笔记

时间:2024-06-07 19:05:02浏览次数:25  
标签:全局变量 第十二天 函数 C语言 编译 模块 自学 main 链接

C语言多文件编程原理

 

一、C语言多个.c的编译原理

分工协作--分离

编译器 怎么分离.c的编译

对每个.c单独进行编译生成目标文件

对所有的目标文件进行链接组合

 

注:每个.c只关心语法是否正确,所有不认识的标签,都在编译时提前声明出来

 

输出.o文件:gcc -c -o main.o main.c

编译时:函数名--函数调用--进行特殊处理(main.c单独编译,里面有使用未在main.c中声明定义的函数)

C语言 = 函数的语言 各个功能用函数分离开,最后组合形成一个可执行文件

 

gcc 工具链: nm main.o -- 可查看编译时各个函数的相对地址,编译时可确定内存中的地址

解析.c,将.c里定义的函数 生成一个清单,同时函数里调用别的函数,只把函数名 作为一个标签这个U标签,最终要在链接时,确定每一个标签的绝对地址

 

链接:gcc -o build main.o x.o

 

同时编译链接:gcc -o build main.c x.c

 

 

二、多个点.c的常见编译错误

每个.c单独编译,所有.o和系统库、标准库一起组合

.c中,如果函数没有声明,编译不报错

 

常见错误:

1、undefined reference(未定义的标签) 其他模块要使用的函数,在最后链接时,没有具体实现的代码

2、multiple definition of getLen : 多个模块中,都实现了同一个函数,多模块链接时,这个标签有多个实现,链接器无法确定使用哪一个

 

 

三、分模块编程方法

一个模块: .c/.h .h时给自身和其他模块使用的

自身: .h 宏定义 结构体的声明 函数声明 (默认extern) 用extern修饰的全局变量

            .c 实现对外公布的函数

 

防止重复定义

#ifndef XXX_H

#define XXX_H

 

#endif  

 

对于全局变量 只能有一个名字

只能一个.c定义赋值,在这个模块的头文件内,用extern来声明这个全局变量,其余文件也能使用全局变量

 

static的作用:

1、修饰局部变量:将原保存在栈区的变量,申请保存在静态数据区,使得这个变量在函数返回后,继续常驻内存

比如统计函数被调用的次数

2、修饰全局变量:变量放置于数据区,但是作用于只在本文件有效

3、修饰函数:这个函数从全局有效,变为本文件有效

标签:全局变量,第十二天,函数,C语言,编译,模块,自学,main,链接
From: https://blog.csdn.net/m0_52001012/article/details/139364115

相关文章

  • C语言学习日志3-关键字ii
    1.4,signed、unsigned关键字编译器缺省默认情况下数据为signed类型的。举例:上面的解释很容易理解,下面就考虑一下这个问题:include<stdio.h>include<string.h>intmain(){chara[1000];inti;for(i=0;i<1000;i++){a[i]=-1-i;//printf("a[%d]=0x%x\n",......
  • 零基础非科班也能掌握的C语言知识18 自定义类型
    自定义类型1.结构体1.1结构的声明1.2结构体变量的创建和初始化1.2.1普通声明1.2.2嵌套声明1.2.3不完全声明(匿名结构体)1.3结构成员访问操作符1.3.1结构体成员的直接访问1.3.2结构体成员的间接访问1.4结构体的自引用1.5结构体内存对齐1.5.1对齐规则1.5.2为什么存在内......
  • 实验6_C语言结构体、枚举应用编程
    实验任务4#include<stdio.h>#defineN10typedefstruct{charisbn[20];//isbn号charname[80];//书名charauthor[80];//作者doublesales_price;//售价intsales_count;//销售册数}Book;voi......
  • 6.C语言scanf及其他输入知识点
    C语言scanf相关用法及其他输入1—scanf输入的用法2—scanf注意的问题3—其他输入1—scanf输入的用法程序#include"stdio.h"intmain(){ intdata; intdata2; intdata3; printf("输入一个整数:\n"); scanf("%d",&data); printf("输入完毕\n"); printf(......
  • C语言基础——函数
             ʕ•ᴥ•ʔ       づ♡ど ......
  • C语言入门 第三章 数据和变量
    目录3.1数据3.1.1整数3.1.2浮点数3.2变量与常量3.2.1定义变量 3.2.2变量分类3.2.3变量的作用域与生命周期 3.2.4常量 3.3基本数据类型 3.3.1int类型 3.3.2其他整数类型3.3.3char类型3.3.4_Bool类型 3.3.5float、double和longdouble类型 3.......
  • 九、C语言:隐式类型转换(整型提升与算数转换)
    一、隐式类型转换C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。二、整型提升//1.表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作......
  • 递推 7-1 sdut-C语言实验-母牛的故事
    7-1sdut-C语言实验-母牛的故事分数20全屏浏览切换布局作者 马新娟单位 山东理工大学有一对夫妇买了一头母牛,它从第2年起每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?输入格式:输入为一个整......
  • 7-3 sdut-C语言实验-骨牌铺方格
    7-3sdut-C语言实验-骨牌铺方格分数20全屏浏览切换布局作者 马新娟单位 山东理工大学斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,很多题目由此衍生而来,骨牌铺方格便是......
  • 0基础认识C语言(分支&循环)
    大家今天有没有开心的敲代码呢?hhhhhh让我们今天继续走进C语言~前提回顾:上节课我们学习了一些单目操作符和双目操作符,还聊了一会儿scanf和printf,今天我们对前一次的内容做一次补充1.如果你想输出一个保留五位小数并且让他右对齐十格,你应该怎么办呢?这个时候我们也是有办......