当前位置:首页 » 编程软件 » 宏处理在哪个编译阶段

宏处理在哪个编译阶段

发布时间: 2023-04-02 00:49:38

Ⅰ 宏的展开是在编译程序中展开的

是的,在编译器的预处理过程中展开的

Ⅱ 宏是什么意思啊,起到什么作用啊

宏,就是“文本替换”,是在编译预处理阶段,宏根据一系列预定义的规则替换一定的文本模式。

以一楼朋友举的例子而言,在预处理期,编译器将你的程序代码里所有出现“MAX”的地方,全都替换成“100”,但是,引号里的内容不换,例如:
printf("MAX");
这句里的MAX不会被替换,它执行的效果是在屏幕上打印出“MAX”三个字母而不是“100”。
for(int i=0; i<MAX; i++)
{
……
}
这空雹知里面,“i<MAX”会替换成“i<100”

另外,宏还可以用来简化一些复杂的操作,甚至是带有参数,例如,在视频游戏和动画制作过程中,我们使用大量24位的位图,但我们的显卡往往对24位寻址支持不够好,都使用32位寻址模式,那么我们就要给位图里的每一像素,添加8位ALPHA值,凑成32位,为和显卡配合融洽。
我们习惯使用这样的宏:
#define RGB32BIT(a,r,g,b) ((b)+((g)<<8)+((r)<<16)+((a)<<24))

你会觉得这跟函数有些类似,的确如此,但是斗消,它们很大的区别就是:(带参数)的函数拥有类型检查,而(带参数)的宏没有,就像我上面举的例子,你必须确保a,r,g,b都是正整数,否则就会出错,而使用函数则可以在编译阶段检查出类型错误。不过却要有时间和内存上的开肆纤销,而宏没有;所以各有利弊吧!

c语言编译系统对宏替换的处理是在什么时候进行的

是正式工作开始之前的准备工作,所以宏替换是在对程序编译之前进行的。

宏替换是C/C++的预处理中的一部分,对于宏定义中的形参,在替换列表中,如果不是作为#或##的操作数,那么将对应实参完全展开(相当于对实参进行求值),然后将替换列表中的形参替换掉,如果是#或##的操作数。

(3)宏处理在哪个编译阶段扩展阅读:

宏的用途在于自动化频繁使用的序列或者是获得一种更强大的抽象能力。

计算机语言如C语言或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。

宏的行为如同是函数对自身程序文本的变形,并且可以应用全部语言来表达这种变形。一个C宏可以定义一段语法的替换,然而一个Lisp的宏却可以控制一节代码的计算。

Ⅳ C关于宏的计算

宏在预编译的时候处理,包含#的指令,都是在预编译的时候处理

相对于运行阶段,你也可以认为是编译阶段。

它只是简单的字符串替换,不是计算。

它不影响代码的执行速度,但是可能会增加代码的长度,影响最终生成的可执行文件的大小。

补充:
表达式(10/5)的计算,应该在运行的时候吧
无法通过编译选项控制这个的。

Ⅳ 宏和函数的区别以及C语言的编译链接过程

  1. 宏在编译之前,需要进行预处理,将宏直接提换成宏定义的代码,是直接替换,也就是说,在预处理之后,你再看代码,发现宏定义已经被替换过来了,你看到是你定义之后的那一串代码。

    而函数,在编译之后,有一系列调用函数的过程,比如,传参,压栈等,这部分是编译器所做的。

  2. C 语言编译链接过程:

    test.c(原始代码) --> 预处理 --> test.i(经过预处理的)--> 编译 --> test.s(汇编代码)--> 汇编 --> test.o(目标文件,其实这部分已经是单个文件的完整二进制文件了,只是还不能执行,如果不懂这句话,可以再问我,其实这部分知识,平时也很少遇到) --> 链接 --> test (可执行文件,比如一个程序由3个代码文件共同生成,那么就会有3个.o格式目标文件,链接是把多个目标文件真正的联系在一起,比如a.o 中使用了 b.o中的一个函数,那么它们两个之间的地址是如何确定的(同理,可引申到使用函数库的问题,使用printf函数,也是需要链接器进行确定printf函数地址,才能知道如何调用。)这个就是链接器的作用)

Ⅵ C++中,宏值到底是因编译环境不同而变,还是因运行环境不同而变

这个与运行环境不同是可能不同的,编译环境会根据你对编译工程的设置(大部分时是默认设置,与当前操作系统、cpu特性等相匹配),对一些宏使用不同的定义。
比如VK_BACK在当前设置中也许是单字节保存的,在某些定制的Windows操作系统中可能使用双字节表示的另一个符号,即它在键盘上与退格键位于同一位置。
严格的、可以移植的程序一般都建议使用定义好的宏,尤其这类容易随运行环境发生重新定义的地方,要用一些宏替代具体数字。用宏替代数字也是比较好的程序设计风格,使数字得到运用解释的同时提高了可读性,并且利于进行统一的调整。

Ⅶ c语言中“宏”是个什么东西 有什么意义

宏定义的作用在预编译阶段,形如 #define A B 就是宏定义了,作用就是在预编译阶段将程序中的A全部视为B,举个例子:
我们在程序最开始,声明如下宏定义
#define pi 3.1415926
那么在我们写程序的时候,我们可以直接使用pi作为一个常量来使用,那么当我们编译程序的时候,编译器会自动将程序中出现的pi替换成3.1415926

第二个例子,利用宏定义定义傻瓜函数
#define mul(A,B) A*B
那么我们可以将mul()在程序中当成函数来使用,为什么叫做傻瓜函数一会来解释,使用方法
mul(3,5) 那么这段代码就相当于计算3*5=15
那么当我们如下使用时就会出现问题
mul(3+2,3) 我们期待的结果是15,而实际结果是9,为什么呢?因为在程序会如下转换
3+2*3=3+6=9 这也就是为什么我们管宏定义出来的函数叫傻瓜函数的原因了~~~

楼主呀~~~完全手写,一定要好评呀!^_^

Ⅷ c语言,说宏展开是在编译时进行的,啥意思啥叫编译时进行的

c语言编写出来的代码叫源代码,是供人看的,如果想让机器执行,需要转换成机器语言,这个转换过程就叫编译。
在c语言中定义的宏,在编译时,会展开(或叫替换)为实际的语句,如:
#define MAX 100
void main()
{
int a=MAX ;
printf("a=%d\n", a );
}
这里MAX是个宏,当编译时,这段代码就会变成:
void main()
{
int a=100; //这里的MAX会变成100
printf("a=%d\n", a );
}
这就是宏展开、宏替换,然后编译器,按这样子的源代码进行编译,生成执行程序

Ⅸ C语言预处理编译链接各个阶段错误,分阶段的说一下

预处理阶段主要是处理宏指令,像什么#include指令、#define指令还有条件编译指令等。
编译阶段主要是检查C语言程序的语法错误,即编写的代码是否符合C语言规则,编译是以.c源文件为单位编译成.obj文件(或者是.o文件)。
链接阶段,就是把相关的.obj文件、所需的库文件等组合成一个可执行的文件。如果缺少相关所需文件,就会链接报错。
指针异常,数组下标越界这些错误属于语义错误,这个只能在执行的时候才能发现问题,这些也叫运行时错误。

Ⅹ const、define、static、extern

extern用于变量的声明,告诉编译器:已经存在一个全局变量,但是不在当前的编译单元内,需要连接的时候在其他编译单元中寻找。

修改变量作用域为当前编译单元,变量生命周期不变;
避免重复定义全局变量
2.2. 修饰局部变量 -
修改变量的生命周期为整个工程周期,变量作用域不变

const修饰右边的变量,用来限制变量为只读属性。

在程序的预编译阶段进行替换处理。

区别:
1.define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
2.define不做检查,不会报编译错误,只是替换。const会编译检查,会报编译错误
3.define在展开的时候才分配内存,展开几次分配几次内存。const在定义的时候会分配一次内存到静态区,使用时不重复分配
4.define可以定义一些简单的运算函数神吵

声明一个只读的静态变量

在多个文件中经常使用的同一个全局变量。
使用场景:
1、.h文件中声辩瞎薯明

2、.m文件中赋值

3、pch文携者件中导入头文件即可在整个项目中访问

这里直接访问即可,都不用放到.pch文件中,因为默认权限是internal
public : 最大权限,可以在当前framework和其他framwork中访问;
internal : 默认权限,可以在当前framework中随意访问;
private : 私有权限,只能在当前文件中访问;

一般常量的话,都用extern const 来代替define。
因为一旦定义#define的方式,整个工程将被重新编译,这样带来的时间浪费可想而知
当然了很多情况还是代替不了的,一般定义常量的时候是应该使用这种方式来定义,不过也只是常量宏不被推荐,但是类函数宏用的还是很方便的,
const、#define的优缺点
编译器可以对const进行类型安全检查。而对#define只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

这种情况还可能出现以下错误
Sending 'const NSString *__strong' to parameter of type 'NSString *' discards qualifiers
原因是需要 NSString* 的地方使用了 const NSString*

.h中 extern const NSString* 替换为 extern NSString* const
.m中 const NSString* 替换为 NSString* const
解释:前者相当于指针本身不可修改,后者表示指针指向的内容不可修改,两者的作用都是使字符串只可读不可写。

热点内容
androidjsonkey 发布:2024-05-06 03:07:31 浏览:730
python主线程子线程 发布:2024-05-06 03:07:20 浏览:763
android系统截屏 发布:2024-05-06 02:57:51 浏览:776
android居左 发布:2024-05-06 02:40:26 浏览:45
网页设置的密码如何删除 发布:2024-05-06 02:20:30 浏览:926
如何查看snmp配置信息 发布:2024-05-06 02:19:48 浏览:489
预科编程 发布:2024-05-06 02:19:42 浏览:140
压缩比英文 发布:2024-05-06 01:56:35 浏览:173
数字php 发布:2024-05-06 01:53:10 浏览:743
编程中怎么 发布:2024-05-06 01:43:32 浏览:630