A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dawn.dai 中级黑马   /  2014-5-7 20:47  /  2368 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 dawn.dai 于 2014-5-8 17:12 编辑

rt,谁来解惑?一个编译前,一个编译中?还是。。。。

6 个回复

倒序浏览
1、预处理是在编译之前进行的
2、函数在程序运行期间被执行(是否执行取决与程序中是否使用)
3、编译是将源程序转成机器可识别的机器码(也就是0和1)
回复 使用道具 举报
这两者没什么必然联系吧,或者说没必要放在一起区分吧;
我看老师的视频,预处理应该就是预编译的意思吧,说的详细点:
#include 文件的复制替换,#if条件编译的处理,#define宏定义的替换,好像是带有#号的就是预处理的代码,这个动作是在编译之前完成的,优先把这些处理完才开始编译代码,代码中的函数此时也就被编译了啊;
比如你写了一个:#define COUNT  5; 那么当你敲入编译指令时,他会先检查有没含有#的,有的话先做处理,将文件中所有的COUNT替换为5,在开始正式编译;我是这样理解的;
回复 使用道具 举报
我理解的是 预处理指令是在编译前执行的

(A) 编译前 做这些事:
文件包含 - 把文件内容拷贝到这里, 比如把函数声明 void test(); 拷贝到这里
宏定义 - 把后面的宏名进行替换, 比如把 i < COUNT 换成 i < 5
条件编译 - 决定哪部分的内容需要编译, 哪部分不需要

(B) 然后进行编译 - 把所有需要编译的代码翻译成 0 1:
这个过程可能包括,
把上一步拷贝来的 void test(); 翻译成 0 1
把上一步替换好的 i < 5 翻译成 0 1
当然也把自己写的函数, 比如 int add(...) {...} 之类的, 翻译成 0 1
条件编译判断不成立的就不翻译
(这一步还检查语法错误)(之后进行链接和运行)

也就是说,
预处理指令是在(A)编译之前处理 - 复制文件、宏名替换、判断编译内容
函数则是在(B)编译时被翻译 (后来在运行时被调用)
它们被处理的时间不同

(嗯是自己理解的, 也不确定对不对)

评分

参与人数 1技术分 +1 收起 理由
bao9107 + 1

查看全部评分

回复 使用道具 举报
godlike 发表于 2014-5-7 21:15
这两者没什么必然联系吧,或者说没必要放在一起区分吧;
我看老师的视频,预处理应该就是预编译的意思吧, ...

遇到就得区分啊
回复 使用道具 举报
Er01c 发表于 2014-5-7 20:57
1、预处理是在编译之前进行的
2、函数在程序运行期间被执行(是否执行取决与程序中是否使用)
3、编译是将 ...

有没有其他区分呢
回复 使用道具 举报
预处理的作用:包含文件、宏、条件编译,
我觉得楼主的问题在宏这,预处理的宏定义中类似函数的定义是不参与运算的,简单的替换,而函数是参与运算的
如我定义一个#define sum(a,b) a+b
在函数中用sum(1,2)*sum(3,4)结果是10,因为他只是简单的把sum(1,2)换成了1+2,sum(3,4)换成了3+4,运算就成了1+2*3+4,所以。。。
而定义了函数的话
int sum(int a,int b){
return a+b;
}
同样执行sum(1,2)*sum(3,4)结果就是14了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马