程序处理的四过程及宏的使用
Posted 蚍蜉撼树谈何易
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序处理的四过程及宏的使用相关的知识,希望对你有一定的参考价值。
一、程序处理的四个过程
1.1 预处理 -E,生成预处理文件 xxx.i
目的:
(1)头文件展开
(2)宏定义替换
(3)替换注释-将注释行变为空行
(4)展开条件编译–根据条件来展开指令
语法:gcc -E hello.c -o hello.i
1.2 编译-S,生成汇编文件
目的:
(1).逐行检查语法错误 --整个四步骤中最耗时的工作。
(2).将程序翻译会汇编文件,得到.s文件
语法: gcc -S hello.i -o hello.s
1.3 汇编 -c 生成目标文件
目的:将汇编指令翻译为二进制代码
语法:gcc -c hello.s -o hello.o
1.4 链接 --生成可执行文件
目的:
(1)数据段合并
(2)数据地址回填
(3)库引入
语法:
gcc hello.o -o hello.exe
二、宏的使用
2.1 宏的优点与缺点
优点:
(1)相对于函数,宏在处理一些简短函数来说,速度更快,因为宏只是在预处理阶段做同等替换,没有内存开销
(2)宏的使用可以帮助我们简化许多工作。
缺点:
(1)宏只适用于那些运算符较短的表达式,若运算时较大,则不应该将它作为宏声明,而应该将它作为独立的函数模块展开。
(2)宏是同等替换,因此在声明宏的时候必须要保证运算的正确性与合理性。
(3)宏是不可以进行调试的,也是不可以进行递归的。
2.2宏的举例:打印日志
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
#define log(msg) Log(__FILE__,__LINE__,__DATE__,__TIME__,msg)
//__FILE__返回当前操作的文件
//__LINE__返回出错的第几行
//__DATE__返回出错的日期
//__TIME__返回出错的时间
void Log(const char* file, int line, const char* data, const char* time, const char* msg)
{
printf("%s : %d : %s [%s-%s]\\n", file, line, msg, data, time);
}
void test01()
{
FILE* fp = fopen("may.txt", "r");
if (fp == NULL)
{
log("打开文件失败");
}
else
{
log("打开文件成功");
}
}
int main(void)
{
test01();
system("pause");
return EXIT_SUCCESS;
}
三、宏定义中“#”和“##”的作用
3.1
使用 # ,把一个宏参数变成对应的字符串
注意,使用#时必须加上双引号
#define print(n) printf(""#n"is%d\\n",n)
void test01()
{
print(10 + 3);//此时会输出 10+3 is 13
}
3.2
##可以把位于它两边的符号合成一个符号。 它允许宏定义从分离的文本片段创建标识符。
#define init(name) struct name##_test{};
void test02()
{
init(my);
my_test s1;
}
以上是关于程序处理的四过程及宏的使用的主要内容,如果未能解决你的问题,请参考以下文章