当前位置:首页 » 编程软件 » 编译期确定端序

编译期确定端序

发布时间: 2022-07-01 07:28:19

‘壹’ 虚函数调用为什么不能在编译时确定

在编译的时候编译器并不知道用户选择的是哪种类型的对象。,如果不是虚函数,则采用早绑定,函数体与函数调用在程序运行之前就绑定了.当函数声明为虚函数时,,编译器通过创建一个虚函数表存放虚函数的地址,在运行时,通过基类指针做虚函数调用时,编译器静态的插入能取得这个虚函数指针并在虚函数表中找到正确的函数版本.

‘贰’ 什么叫编码期,编译期,运行期在各个期间都做了什么

编码期就是编写代码,代码这时为文本状态,编译期即将文本代码转换为中间码的过程,运行期就是执行程序。

‘叁’ 请问java中的编译期和运行期有什么区别

编译时是调用检查你的源程序是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。
运行时是java虚拟机解释执行字节码文件。

‘肆’ 汇编指令在编译时就已经确定了在内存中的地址

程序源代码编译连接生成可执行文件后,就确定了所有指令的偏指,只是在执行时才确定其段指。所以你在Linux下用objmp就可以看到overhere标签的地址,其实这是偏指。

‘伍’ 如果一个工程中有多个C++源文件,怎么确定先编译哪个源文件呢

授人以鱼,不如授人以渔.建议楼主好好看看<<C++ primer>>这本书,目前有中文第四版,我非常喜欢它,我也是去年十月份开始学习C++的,看完它再看<<effective C++>>和<<more effective C++>> , 尤其是<<effective C++>>,简直是C++的圣经,非看不可...最后到高级了.你还可以看看<<深入探索C++对象模型>>...我全看完了,感觉受益匪浅.

好了,下面开始解答问题:
解答问题之前,复习一下基本概念;
1:C++中的全局变量,在整个程序中只能定义一次,但可以声明多次(不限次数); 在一个地方定义,,然后在其他地方使用时,要先声明一下;
2:什么叫变量定义? 比如 int i; 这就是定义;
而 extern int i; 则 只是声明;
但如果写作 extern int i = 0; 则这也是定义,不是声明;(是不是有点绕??熟悉了就很简单了)

所以,我觉得你的问题.实际上是源自你对C++语法中变量的定义和声明这两个概念的模糊;

你说你在a.cpp 中声明 i, 而在b.cpp中必须用extern 声明才可通过编译,这是正常的..因为你的i是在a.cpp中定义的..
你说你在b.cpp中声明i, a.cpp中是否使用extern都可以通过编译,这个问题嘛.我估计你的代码实际上仍然是在a.cpp中定义了i,而b.cpp中定义的i不是全局的.

至于你说如果有多个源文件.那么编译顺序如何确定.这个问题很难回答你,恐怕不同的编译器对此的处理都不大相同..我觉得你不应该考虑这个问题..实际上编译器会把不同的源文件分别、单独地编译成独立的模块,最后再链接成一个可执行程序,因为它们都是独立编译的模块,理论上说.编译顺序是不重要的.

我觉得倒是应该告诉你如何正确地管理和使用全局变量;
首先,建立一个 "global.h"(文件名随你,我这里举个例子而已,记得在头文件里加上头文件保护符哦!如果你告诉我你不知道什么是头文件保护符,我强烈建议你不要再往下看了..立刻去买一本C++primer吧);
在global.h文件中.声明你所需要的所有全局变量,以下是 global.h的内容:
#ifndef GLOBAL_H
#define GLOBAL_H

extern int g_i; // 此处是声明,另外,在全局变量前加一个 g_ 是好习惯.

#endif

然后新建一个 global.cpp文件,包含 global.h文件,接着,定义所有的全局变量,
以下是global.cpp的内容:
#include "global.h"

int g_i = 1982; // 此处是定义!!!

至此,一切搞定,最后,在你需要用到全局变量的cpp文件中包含 global.h吧...比如你的a.cpp和b.cpp; 编译顺利了吧?

/////////////////////////////////////////////
看到楼主的新问题了..我再补充回答一下.
问题1:我的疑问是,如果在my.cpp中定义了theApp,则必须在mfc.cpp中用extern声明theApp,否则编译出错;但是如果在mfc.cpp中定义theApp,则不必在my.cpp中声明,编译也能够通过,这是为什么呢?

我的回答: 这个问题还是声明和定义的问题.我之前说过了.一个变量(比如你的这个theApp),在整个程序中只能定义一次, 然后在需要使用它的地方,要先声明后使用.
因此,看看实际情况:你在my.cpp中定义了theApp,当你在mfc.cpp中要使用它,当然要先声明它咯,而声明变量必须加上extern,不然就变成定义了,那么就会导致你在my.cpp和mfc.cpp中定义同名全局变量两次,自然就无法通过编译.
而如果你在mfc.cpp中定义theApp的话,因为在my.cpp中没有直接用到 theApp.所以,就不需要声明了.这下清楚了吧?呵呵.

还有,补充一个基础知识,,我们通常写 int i; 这样的语句是"定义","定义"实际上就起到了"声明"的作用; 所以,如果你不是定义变量,而是单纯要声明一个外部的全局变量(也就是其他cpp文件里的全局变量)的时候,是肯定要加extern的.
我觉得楼主是对 与要加extern感到诧异.

问题2:
这个程序我运行的结果是只有构造函数的那些输出语句执行了,而析构函数的那些输出语句并没有执行,这又是为什么呢?

这个讲起来有点多.涉及到一个C++程序的启动过程:我简单地说说,
以windows为例,点击一个exe程序后,系统创建一个"进程内核对象",创建4G虚拟内存空间以及其他的一些执行程序需要的资源,然后创建"线程内核对象",启动一个线程(也就是主线程了),这个线程调用一个 C++ startup函数,该函数会初始化 你的程序中的所有全局变量,( 这个时候你就看到你 theApp的那些基类的构造函数的执行,并打印出来),所有全局变量构造好以后,才开始执行你写的main函数.
然后,你的main函数 return了.这时,执行一个C++执行期函数exit(),析构你的所有全局变量(也就是theApp), 但这个时候你的console窗口已经退出了.所以你看不到那些析构函数执行时的打印信息了.呵呵.

另外:我真的非常推荐楼主先好好看看<<C++ primer>>和<<effective C++>>这两本书,不要把<<深入浅出mfc>>当成C++教材来看,虽然这本书很好,并且通过mfc,很好地示范了C++ 继承,虚函数的妙用.但是,<深入浅出mfc>的作者侯捷说的好:勿于浮沙筑高台.. 基础打牢非常关键. 当你把C++的基础知识搞清以后,再看深入浅出 mfc 其实是很简单的..

‘陆’ 简述将源程序编译成可执行程序的过程

一个源程序到一个可执行程序的过程:预编译、编译、汇编、链接。其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。

预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则如下:

1、删除所有的#define,展开所有的宏定义。

2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。

3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。

4、删除所有的注释,“//”和“/**/”。

5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。

6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。

(6)编译期确定端序扩展阅读:

编译过程中语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。

其中,静态语义通常包括:声明和类型的匹配,类型的转换,那么语义分析就会对这些方面进行检查,例如将一个int型赋值给int*型时,语义分析程序会发现这个类型不匹配,编译器就会报错。

‘柒’ 判断当前程序运行的计算机平台的字节序是大端序还是小端序

Java编译后.class文件是二进制字节码,而不是系统能识别的机器码,所以直接运行.class文件,系统不能识别,而Java为了解决这个问题,采用一个中间转换过程,必须要把.class文件,转换成对应操作系统所能识别的机器码。 于是把这个转换的任务交给了JVM(java虚拟机),所以只要安装虚拟机的操作系统就能运行Java开发的程序,而不管你用的什么操作系统,因为转换工作是由虚拟机来帮你完成的。 举个例子:假如:你(相当于Java程序)和美国人(一种操作系统)谈话,而你不懂英语,美国人不懂汉语,怎么办呢?你会想到找个翻译(Java虚拟机),把你说的话翻译成英语。 这个时候你又和一个德国人说,只要通用的翻译就可以了

‘捌’ 编译程序的工作过程一般可以划分为哪5个基本阶段,还自始至终伴随进行哪两项工作

1、编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;中间代码生成;代码优化;目标代码生成。

2、编译程序的工作过程一般自始至终伴随进行信息表管理和出错处理两项工作。

主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

(8)编译期确定端序扩展阅读:

解释程序是一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行用户程序时,它直接执行源程序或源程序的内部形式(中间代码)。因此,解释程序并不产生目标程序,这是它和编译程序的主要区别。解释程序的工作过程如下:

1、由总控程序完成初始化工作。

2、依次从源程序中取出一条语句进行语法检查,如有错,输出错误信息;如果通过了语法检查,则根据语句翻泽成相应的指令并执行它。

3、检查源程序是否已经全部解释执行完毕,如果未完成则继续解释并执行下一条语句,直到全部语句都处理完毕。

‘玖’ 程序的编译期,链接期, 运行期各执行哪些操作

参考一下:

源文件的编译过程包含两个主要阶段,而它们之间的转换是自动的。第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中还有其他许多预处理指令
这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。
预处理器显示为一个独立的操作,但一般不能独立于编译器来执行这个操作。调用编译器会自动执行预处理过程,之后才编译代码。
编译器为给定源文件输出的是机器码,执行这个过程需要较长时间。在对象文件之间并没有建立任何连接。对应于某个源文件的对象文件包含在其他源文件中定义的函数引用或其他指定项的引用,而这些函数或项仍没有被解析。同样,也没有建立同库函数的链接。实际上,这些函数的代码并不是文件的一部分。这些工作是由链接程序(有时称为链接编辑器)完成的
链接程序把所有对象文件中的机器码组合在一起,并解析它们之间的交叉引用。它还集成了对象模块所使用的库函数的代码。这是链接程序的一种简化表示,因为这里假定在可执行模块中,模块之间的所有链接都是静态建立的。实际上有些链接是动态的,即这些链接是在程序执行时建立的。

链接程序静态地建立函数之间的链接,即在程序执行之前建立组成程序的源文件中所包含的函数链接。动态建立的函数之间的链接(在程序执行过程中建立的链接)将函数编译并链接起来,创建另一种可执行模块—— 动态链接库或共享库。动态链接库中的函数链接是在程序调用函数时才建立的,在程序调用之前,该链接是不存在的。

动态链接库有几个重要的优点。一个主要的优点是动态链接库中的函数可以在几个并行执行的程序之间共享,这将节省相同函数占用的内存空间。另一个优点是动态链接库在调用其中的函数之前是不会加载到内存中的。也就是说,如果不使用给定动态链接库中的函数,该动态链接库就不会占用内存空间

‘拾’ Java代码的编译期绑定和运行期绑定是什么意思

如果打包成jar的话很好如果是exe的话就有点麻烦了可参考:想要把java生成可执行文件需要第三方软件的支持,不过在没有安装JDK的机器上是不可能运行JAVA程序的,哪怕是编译成为exe文件。将Java应用程序本地编译为EXE的几种方法(推荐使用JOVE和JET)1.从获得一个TowerJ编译器,该编译器可以将你的CLASS文件编译成EXE文件。2.利用微软的SDK-Java4.0所提供的jexegen.exe创建EXE文件,这个软件可以从微软的网站免费下载,地址如下:7.Instantiations公司的JOVE/jove/ejovesystem.htmJOVE公司合并了以前的SuperCede,一个优秀的本地编译器,现在SuperCede已经不复存在了。8.JToEXEBravoZuluConsulting,Inc开发的一款本地编译器,本来可以从该公司的网页上免费下载的,不过目前在该公司的主页上找不到了。

热点内容
优质网站为什么用ip服务器 发布:2024-05-17 09:43:34 浏览:792
安卓机图片存在哪里 发布:2024-05-17 09:42:54 浏览:61
ip地址怎么查看服务器上的文件 发布:2024-05-17 09:29:51 浏览:979
轱轮算法 发布:2024-05-17 09:29:10 浏览:95
安卓手机锁屏密码一般怎么画 发布:2024-05-17 09:29:05 浏览:347
堆栈是按组织的存储区域 发布:2024-05-17 09:29:02 浏览:695
sqllinkserver 发布:2024-05-17 09:19:35 浏览:458
访问控制列表的编号 发布:2024-05-17 09:11:24 浏览:785
无线密码忘了怎么办修改密码 发布:2024-05-17 08:59:54 浏览:922
android自定义字体 发布:2024-05-17 08:58:24 浏览:541