当前位置:首页 » 编程软件 » 函数编译与预处理

函数编译与预处理

发布时间: 2025-07-27 17:19:50

‘壹’ 关于预处理的几个问题

关于预处理的相关问题,以下是简洁直接的答案:

  1. 含参数宏与函数的区别

    • 含参数宏:在预处理阶段进行文本替换,不进行类型检查,也没有调用开销,但可能导致代码膨胀。
    • 函数:在编译阶段生成调用代码,进行严格的类型检查,有调用开销,但代码更简洁、可重用。
  2. 枚举与define的区别

    • 枚举:是一种用户定义的类型,为整型常量赋予易于理解的名字,支持类型安全和范围检查。
    • define:是简单的文本替换,不定义新类型,不进行类型检查,只是将标识符替换为对应的值。
  3. typedef与define的区别

    • typedef:为现有类型定义一个新的名字,是类型别名机制,不进行文本替换。
    • define:是简单的文本替换,不定义新类型,只是将标识符替换为对应的类型或表达式。
  4. define和const定义常量的区别

    • define:定义的常量是预处理指令,在编译前进行文本替换,没有类型信息。
    • const:定义的常量是变量的一种,具有类型信息,可以进行类型检查,存储在内存中。
  5. 宏定义和内联函数的区别

    • 宏定义:在预处理阶段进行文本替换,不进行类型检查,可能导致代码膨胀和难以调试。
    • 内联函数:在编译阶段进行代码展开,有类型检查,可以优化调用开销,但编译器可能不总是展开内联函数。内联函数提供了更好的可读性和调试性。

以上内容总结了预处理中几个常见问题的区别,希望有助于理解预处理在不同场景下的应用。

‘贰’ c语言知识总结

c语言概要
第一章、 概述
1、 c语言的基本知识
1.1、 c语言的执行步骤
编辑-程序代码的录入,生成源程序*.c
编译-语法分析查错,翻译生成目标程序*.obj
(语法或逻辑错误,从第一个开始改,变量定义,语句格式,表达式格式等)
链接-与其他目标程序或库链接装配,生成可执行程序*.exe
执行
1.2、 main函数的基本知识
main()函数的位置
c程序总是从main( )函数开始执行
一个c程序可以包含一个主函数,即main()函数;也可以包含一个main()函数和若干其它函数
1.3、 c程序的结构
函数与主函数
程序由一个或多个函数组成
必须有一个且只能有一个主函数main()
程序执行从main开始,在main中结束,其他函数通过嵌套调用得以执行
程序语句
C程序由语句组成
用“;”作为语句终止符
注释
//

/* */ 为注释,不能嵌套
不产生编译代码
1.4、c 程序书写的规则
习惯用小写字母,大小写敏感
不使用行号,无程序行概念:通常一个语句占一行
可使用空行和空格
常用锯齿形的书写格式;同一层次结构的语句上下对齐。
第二章、基本数据类型与运算
2.1、c程序的数据类型
注意类型和变量含义的不同(类型是固定好的名字,变量是自己起的名字)
变量占用的存储空间
数据类型
基本类型:整型、字符型、浮点型(单精度型,双精度型)
构造类型:数组类型、结构体类型
指针类型
空类型
注意基本类型赋初值的方式
基本数据类型的表示形式
整形数据
十进制:以非0数字开头,如:123,-9,0
八进制;以0数字开头,如:0123,067
十六进制:以0x开头,如:0x123,0xff
实型数据
十进制:必须带小数点,如:123.0,-9.0
指数形式;如:1.23E3,0.9e-2,5e2
字符型数据
普通字符:如:’a’,’2’,’H’,’#’
转义字符:如:’\n’,’\167’,’\xlf,’\\’
(实现几列的对齐:指定宽度。如%100\ ‘\t’制表位)
(字符串长度。“abc\n\t\\” strlen 6; sizeof 7)
基本数据类型的存储长度
整型
Int 字节数 2 位数 16 数的表示范围 -32768—32767
Short 2 16 -32768—32767
Long 4 32 -2147483648—2147483647
实型
Float 4 32 3.4e-38---3.4e38
Double 8 64 1.7e-308---1.7e308
字符型
Char 1 8 -128----127
2.2、标识符命名规则
C语言标志符命名规则
标识符有数字,字母,下划线组成
标识符的首字符必须为字母和下划线
标识符不能为c语言的保留字(关键字)
如:auto extern sizeof float static case for struct char goto switch continue in typedef const if union default long unsigned do register void double return else short while enum signed
算术运算符 + - * / %
关系运算符 > < == >= <= !=
逻辑运算符 ! && ||
位运算符 << >> ~ | ^ &
赋值运算符 = 及其扩展赋值运算符
条件运算符 ? :
逗号运算符 ,
指针运算符 * &
求字节数运算符 sizeof
强制类型转换运算符 (类型)
分量运算符 . ->
下标运算符 [ ]
其他 如函数调用运算符()
运算符的优先级
由高到低:单目运算符,算数运算符,关系运算符,赋值运算符
说明:单目运算符:自增运算符,自减运算符,类型装换运算符。结合方向:自右至左
如:++--I 先—i.。
算术运算 结合方向自左至右
2.3基本运算和表达式
关系表达式和逻辑表达式
(a>b)&&(x>y) (a==b)||(x==y) !=a||(a>b)
A&&b.a为0.不执行b
A||b a为1.不执行b
在 c 中逻辑运算结果:1代表“真”,0代表“假”;
判断一个表达式是否真:0代表“假”,非0代表“真”
条件表达式 逗号表达式
如:k=5,k++
逗号值为5;k为6.
表达式1?表达式2 :表达式3
K=5>6 ? 1 : 0
2.4、混合运算的数据类型转换
2/3+0.5 双精度浮点型
第三章、顺序结构程序设计
3.1、c语句的分类
简单语句
表达式语句 表达式+分号
空语句 只有分号的语句
复合语句 用花括号将若干语句括起来
流程控制语句
选择语句 if ,switch
循环语句 while, do while , for
转移语句 break ,continue ,return goto
3.2、格式输入函数scanf
一般形式:scanf(“格式控制字符串“,地址列表);
使用scanf函数时,需要注意:
格式字符的个数必须与输入项的个数相同,数据类型必须一一对应,非格式字符串(说明性的)要原封不动的输入。
输入实行数据时,可以不带小数点,即按整型数据输入
数值型数据与字符或字符串混合输入时,需要注意输入方式。
3.3、格式输出函数printf
Printf(“格式控制字符串“,输出列表);
指定输出格式,由格式字符串和非格式字符串两种组成,非格式字符串照原样输出。
%[标志][输出最小宽度][.精度][长度]类型
标志:- 左对齐;+ 右对齐;
%f, %d, %c, %s
3.4、其他输入输出函数
Putchar getchar puts gets
第四章、选择结构程序设计
If选择结构
单分支
If(表达式)
语句
双分支
If(表达式)
语句1
Else
语句2
多分支
If (表达式1)
语句1
Else if(表达式2)
语句2
。。。
Else if(表达式m)
语句m
Else
语句n
Switch(表达式)
{
Case 常量表达式1:语句1;break;
Case 常量表达式2:语句2;break;
。。。
Case 常量表达式m:语句m;break;
Default:语句n;break;
}
注意break的使用
第五章、循环结构程序设计
循环三要素
初始条件 ;终止条件 ;在初始条件和终止条件间反复做某件事情(循环体)
While(表达式)
语句

Do
语句
While(表达式);

For(循环体变量赋初值;循环条件;循环变量增量)
( for( ) ; // ; 进行时间延迟。在信息交换等时用。如for(i=0,i<100) ; 互相通讯的时间延迟。 Delay )
Break语句 :不能用于循环语句和switch语句之外的任何其他语句;跳出循环。
Continue语句 :跳过循环体中剩余的语句而强行执行下一次循环;跳出本次循环。
第六章、函数与编译预处理
6.1、函数的定义和调用
类型标识符 函数名 (形式参数列表)
{ 声明部分
语句
}
例:
Int max (int x,int y)
{int z;<br>Z=x>y?x:y;<br>Return(z);}
6.2、局部变量和全局变量
注意函数中静态变量的定义和使用
6.3、变量的存储类型
局部变量的存储类型
自动变量(auto) 动态存储
局部静态变量(static) 静态存储
寄存器变量(register) 静态存储
全局变量的存储类型
自动变量(auto) 动态存储
外部变量 (extern) 静态存储
全局静态变量(static )静态存储
Extern 外部引用
Static 不能用extern 引用。
第七章、数组
7.1、一维数组的定义和使用
特别需要注意循环体的初值,终止条件
例:
Main()
{
Int I,a[10];
For(i=0;i<=9;i++)
A=I;
For(i=9;i>=0;i--)
Printf(“%d”,a);
}
注意下标问题
7.2、二维数组的定义和使用
二维数组的初始化
例如:
Int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
Int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
Int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
Int a[ ][4]={{1,2,3,4},{5},{9,10,11,12}};
例如:int a[3][3]={{1},{2},{3}};
是对每一行的第一列元素赋值,未赋值的元素取0
7.3、字符数组和 字符串
字符串用字符数组来处理,结束标志符 ‘\0’
如:char c[ ]={“I am happy”};
用字符串常量使字符数组初值化
Char c[ ]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’\0’};
第八章、指针
8.1、地址和指针的概念
Int I;
Int *i_point;
8.2、指针变量和变量的地址
操作符:* &
8.3、指针和一维数组
若有定义
Int a[10];
Int *p=a;
分析下面表达式的含义:
A, &a,
*(a+i), a+I,
*(p+i), p+i
A=*(a+i)=*(P+i)
&a=a+i=p+i
8.4、指针与字符串
Main()
{
Char string[ ]=”I love china!”;
Printf(“%s\n”,string);
}
Main()
{ char *string=”I love china!”;
Printf(“%s\n”,string);
}
8.5、指针变量作为函数参数
形参的定义方式;实参的形式;参数的传递方式。
第九章、结构体
9.1、结构体类型和变量的定义
Struct 结构体名
{成员列表};
Struct student
{char stuNO[8];<br>Char name[20];<br>Char sex;<br>Int age;<br>Float score;<br>Char addr[30];<br>};

Stuct student
{char stuNO[8];<br>Char name[20];<br>Char sex;<br>Int age;<br>Float score;<br>Char addr[30];<br>};
Struct student stu1, stu2;
9.2、结构体变量的引用
一般形式为:
结构体变量名.成员名
9.3、结构体数组
结构体数组 结构体数组元素.成员名
指向结构体的指针变量
(*p).成员名
p->成员名
其他
Strcpy(字符数组1,字符串2)
Strcat(字符数组1,字符数组2)
Strcmp(字符串1,字符串2)
Strlen(字符数组)

‘叁’ 源程序到可执行程序的编译过程

源代码到可执行程序的编译过程涉及四个关键步骤:预处理、编译、汇编和链接。

预处理是程序编译的第一步,由独立的预编译器处理,不属于编译器的直接工作。它主要负责处理预处理指令,如条件编译,但并不涉及运行时间。

编译阶段将源代码转换成特定硬件平台的汇编语言,比如X86的x86汇编或ARM的ARM汇编,生成.s/.asm文件。这个过程涉及语法、词法、语义分析等六大部分,以确保变量、函数等的正确使用和错误检测。

编译过程中,符号表管理至关重要,记录了标识符及其属性,如类型、内存占用和地址,而错误管理则用于识别并报告语法错误(如拼写错误、括号匹配问题)和语义错误(如类型不匹配、作用域错误)。

从源程序到目标程序,可能会进行多次遍历以优化代码,但过多遍历会增加编译时间。最终,汇编阶段将汇编语言转换为机器语言的可重定位目标文件,如.o/.obj。

链接是编译的最后一步,将目标文件、启动代码和库文件结合,形成可执行的.exe文件。链接分为静态和动态两种,静态链接时所有库代码会直接嵌入程序,而动态链接则依赖运行时查找库。

热点内容
安卓如何打开nc格式文件 发布:2025-07-27 19:47:45 浏览:353
压缩后的 发布:2025-07-27 19:39:22 浏览:579
怎么改服务密码 发布:2025-07-27 19:17:16 浏览:637
python小项目源码 发布:2025-07-27 19:12:19 浏览:369
python画矩形 发布:2025-07-27 19:07:31 浏览:995
小米盒子怎么看配置 发布:2025-07-27 19:00:34 浏览:838
百度打开密码是多少 发布:2025-07-27 18:53:11 浏览:23
华为方舟编译器免费使用 发布:2025-07-27 18:53:08 浏览:193
组态王与数据库连接 发布:2025-07-27 18:52:29 浏览:308
dhcp配置错误怎么修复 发布:2025-07-27 18:41:09 浏览:820