程序翻译环境以及宏介绍

程序的翻译环境和执行环境
翻译环境:在这个环境中源代码被转换为可执行的机器指令。将.c文件翻译成exe(可执行文件)文件
翻译分为两部分:
编译,链接
所有源文件(.c .h)都会经过编译生成一个目标文件(.obj),目标文件和链接库通过链接生成可执行程序。(连接器在vs叫link.exe)
编译又分为三部分:
预处理(预编译)
所有预处理指令都在预处理阶段进行编译(文本编辑)
编译
把c语言代码翻译成汇编代码
汇编:
把汇编代码翻译成二进制的指令生成.o文件(目标文件),生成符号表

执行环境:用于实际执行代码(2进制指令);exe文件在运行环境下运行,合并段表,符号表的合并和重定位。
目标文件和链接库通过链接生成可执行程序。(连接器在vs叫link.exe)
过程:程序首先要载入内存中,后开始执行,调用main函数,开始执行程序使用运行堆栈。
预处理详解
预定义符号
_FILE_   进行编译的源文件
_LINE_  文件当前行号
_DATE_ 文件被编译日期
_TIME_ 文件被编译时间
_STDC_ 
以上均可以被打印,除了行号打印时用%d,其他均为%s
eg:printf("%s",_ _FILE_ _)
#define
定义常量
eg:  #define MAX 100
       #define A "abcd"
       #define INT int
前者替代后者(表达式也可,比如3+4)
定义宏:
#define name(参数) stuff
参数列表的左括号必须要和name紧贴在一起,不然会被认定为和stuff一起
eg #define  ADD(x,y)  x+y
注意宏返回的是表达式,而并非表达式的结果
int c=4*ADD(10,20),结果是60,因为4*10+20
同理有:
#define a(x) (x*x);
a(5+1),结果是11,因为(5+1*5+1)
宏不能递归,即自己调用自己
字符串中宏,常量不会被替换。eg printf("MMM");
printf打印多个字符串时会当作一个字符串
eg:printf("hello"  "world"\n)//helloworld
#变量
把一个宏参数变成对应的字符串
在宏中使用#变量不会将变量完全替换。
#define p(n.format) printf("the value of"#n"is “format”",n)
比如 int a=10;p(a,"%d"),使用#n的结果为a而并非10
补充,format是表示变量的类型,所以format会被替换成n的值
##:
可以把位于塔两边的符号合成一个符号
eg: #define CAT(v,n)v##n
int value10=100;
printf("%d",CAT(value,10))//100 CAT(value)相当于value10
注意合成的必须是一个合法标识符,否则其结果就是未定义的
带有副作用的宏参数
b=a+1//不带副作用
b=++a//带有副作用 
易错
#define MAX(x,y) ((x)>(y)?(x):(y))
int main(
{
int a=3;
int b=5;
int m=MAX(a++,b++);
打印a,b,m的值//4  7  6  
注意宏代入得是未计算的表达式而非结果
因此 int m=((a++)>(b++)?(a++):(b++)),3小于5,因此执行后面的表达式,同时a和b各增1,由于只计算后面的表达式,所以b再加1,而a不会再加.注意?后面的b带的值是5,因为先前b传的值是5;
宏较函数的优点是效率高,占用小,执行过程简单,而且没有类型的限制
缺点 大幅增加代码长度(因为每次使用宏宏的代码就会插入程序中,而函数只有一段),没法调试,容易带来运算符优先级问题,易出错
宏可以实现函数实现不了的
eg #define MALLOC(num,type)  (type*)malloc(num*sizeof(type)),这样用malloc就会方便
如果逻辑比较简单使用宏不然使用函数
命名约定
宏名全部大写,函数名不要全部大写
若之前自定义了一个宏或者常量,下文开始不想用了,那么可以用#undef来取消,
#define M 100

#undef M
常见的条件编译指令
#if 常量表达式 //条件成立,那么下面代码则会编译
    代码;
#endif
多分枝:
#if 表达式
   
#elif 表达式

#endif 表达式
判断是否被定义:
#if defined(symbol)
         代码          //如果被定义那么执行代码,
#ifdef

#endif


#if !defined(symbol)
   代码    //如果未被定义那么代码执行
#ifndef

#endif

指令可嵌套
文件包含
头文件包含两种形式
1 .包含本地文件(自己的.h文件)
(先在)
#include “xxx.h”
2 包含标准库的头文件
#include <xxx.h>
eg:#include <stdio.h>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值