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

一、程序处理的四个过程
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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值