程序编译与链接,以及预定义符号,

1.预处理标识符又称预定义符号,它们的值是(字符串常量、十进制数字常量)

(1)__FILE__   :表示进行编译的源文件名

(2)__LINE__  :表示文件当前行的行号

(3)__DATE__ :表示文件被编译的日期

(4)__TIME__  :表示文件被编译的时间

(5)__STDC__:表示若编译器遵循ANSI C,其值为1,否则未定义

用处:__LINE__和__FILE__用于在确认调试输出来源方面,__DATE__和__TIME__用于在被编译的程序中加入版本信息,__STDC__用于在ANSI和非ANSI环境都必须进行编

译的程序中结合条件编译:

#include <stdio.h>
int main()
{
	printf("file:%s\n line:%d\n date:%s\n time:%s\n"
		,__FILE__,__LINE__,__DATE__,__TIME__);
	return 0;
}

2.#:预处理器把 #宏参数(#argument)这种结构翻译为"argument" 

#include <stdio.h>
#define M 10
#define PRINTF(FORMAT,VALUE)\
printf("the value of " #VALUE " is "FORMAT "\n",VALUE)
int main()
{
	PRINTF("%d",M);
	return 0;
}

3.##: 对于这种两个#的结构,预处理器把它两边的符号连接成一个符号

4.关于宏和函数的区别。

   总的来说,宏和函数的目的都是集中地实现某个特定的功能,但是二者有一些区别:

   (1) 函数:函数代码只出现于一个固定的地方,程序每次使用这个函数时,都调用那个地方的同一份代码;所以函数存在调用、返回的额外开销;但是函数参数只在函数调用

时求值一次,它的结果值传递给函数,表达式的求值结果更加容易预测,并且参数的副作用不会造成任何特殊问题;此外,函数的参数是与类型有关的,若参数类型不同就需要

使用不同的函数,即使它们的任务相同

   (2) 宏:程序每次使用宏时,宏代码都被插入到程序内部,除了非常小的宏之外,程序长度大幅度增长;无需调用返回相比函数宏速度更快;宏参数求值是在所以周围表达式

的上下文环境,如果不加圆括号,邻近操作符的优先级会产生不可预期的结果;参数每次用于宏定义时,都会重新求值,则具有副作用的参数会产生不好的后果;另外,宏与类

型无关,只要参赛的操作合法,它可以使用任何参数类型

    总的来说,代码比较长的程序,可以用函数实现的就不用宏来实现

5.关于编译链接的整个过程和详细的每个过程

   总体来说,一个c程序从产生到实现要经过以下过程:

但是真正的编译系统其实会做2件事情:编译、链接.

(1)编译:又分为编译 和 汇编两个过程

     <1>编译:.c源程序---汇编语言的过程

     <2>汇编:汇编语言到.obj目标文件(二进制文件)的过程

     这里的目标文件已经是二进制文件了,在编译过程中,如果编译器发现.c的源代码有错误就会报错,这时程序员重新检查.c源程序;若.c源文件通过编译,就会生成.obj目标

文件(根据平台不同,.obj扩展名不同,windows下是.obj文件;linux下是.o文件),无论如何通过编译后的目标文件是二进制文件

(2)链接:把.obj的目标文件链接成.exe可执行文件


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值