程序处理的四过程及宏的使用

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;
}

以上是关于程序处理的四过程及宏的使用的主要内容,如果未能解决你的问题,请参考以下文章

C语言文件的编译与执行的四个阶段并分别描述

php中const和define的区别

GCC编译C源代码的四个步骤

Flask模板宏的概念和基本使用

程序并发操作中,解决数据同步的四种方法

12_关于flask中的宏