预编译

C++头文件的包含顺序研究

孤者浪人 提交于 2019-12-18 15:20:34
作者:朱金灿 来源: http://www.cnblogs.com/clever101 一.《 Google C++ 编程风格指南》里的观点 最近公司在推行编码规范,领导提议基本上使用《 Google C++ 编程风格指南》。其中《 Google C++ 编程风格指南》对于头文件的包含顺序是这样的: Names and Order of Includes link ▽ Use standard order for readability and to avoid hidden dependencies: C library, C++ library, other libraries' .h, your project's .h. All of a project's header files should be listed as descendants of the project's source directory without use of UNIX directory shortcuts . (the current directory) or .. (the parent directory). For example, google-awesome-project/src/base/logging.h should be included as #include

【JS】预编译(图解)

别来无恙 提交于 2019-12-12 13:28:03
预编译是js的一个特色,也算是闭包之前最难的一个知识点。预编译有4句公式,而这4句公式只要背熟就能理解预编译。这4句公式放在本文最末尾。本节篇幅比较长,要理解的东西也比较多。在学习预编译之前要记住下面这句话: JS的声明和执行(赋值)是分开两步操作的,声明属于预编译环节。 要了解预编译,就要先了解变量声明。变量声明又分为全局和局部。局部变量和作用域有关,稍后会讲到。 全局变量声明要记住2句话 1、任何变量,如果未经声明就赋值,此变量就为全局变量所有。 2、一切声明的全局变量,都是window的属性。 微信订阅号:Rabbit_svip 在Console可以看到输出的window里面,有变量a。 如果输出 window.a ,那就直接输出了123了。由此可以解析上面所说的全局变量的两句话。在全局声明的变量,称为全局变量。全局变量的作用域就是全局。局部变量的作用域通常是在函数内部。全局作用域称为GO,全称:Global Object。临时作用域成为AO,全称:Activation Object。而GO又可以理解为window这个对象。GO和AO要和JS的预编译一起理解。 【预编译公式】 1、创建GO/AO对象。 2、找形参和变量声明,将变量和形参名作为AO的属性名,值为undefined。 3、将实参值和形参统一。 4、在函数体里面找函数声明,值赋予函数体。 看下面的代码

stdafx.h、stdafx.cpp两个文件的作用

梦想的初衷 提交于 2019-12-07 04:15:01
stdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? 这两个文件用于建立一个预编译的头文件.PCH和一个预定义的类型文件STDAFX.OBJ。 由于MFC体系结构非常大,包含许多头文件,如果每次都编译的话比较费时。因此,我们把常用的MFC头文件都放在stdafx.h中,如afxwin.h、afxext.h、afxdisp.h、afxcmn.h等,然后让stdafx.cpp包含这个stdafx.h文件。这样,由于编译器可以识别哪些文件已经编译过,所以stdafx.cpp就只编译一次,并生成所谓的预编译头文件(因为它存放的是头文件编译后的信息,故名)。 如果读者以后在编程时不想让有些MFC头文件每次都被编译,也可以将它加入到stdafx.h中。采用预编译头文件可以加速编译过程。 Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。 为避免这种浪费,AppWizard和Visual C++编译程序一起进行工作,如下所示: 1.AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFC include文件。且这一文件可以随被选择的选项而变化。

unexpected end of file while looking for precompiled headerdirective Add directive to 'stdafx.h' or rebuild precompiled header错误

馋奶兔 提交于 2019-12-05 17:14:23
解决方式 : 项目工程右键->propertity(属性),选择不用于预编译头 原因 : C++的编译过程如下: 当头文件很多时,预编译过程需要耗费大量时间,为了减少重复编译的次数,C和C++提供了预编译任何 C 或 C++ 代码方式,将stdafx.h(预编译头)内的文件,以已编译状态的代码存储在文件中,以及在随后的编译中,将预编译的代码与仍在开发的代码结合起来,提高编译速度。 预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。 编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。 因此,所有的CPP实现文件第一条语句都是:#include "stdafx.h"。 报错问题也是与此有关 来源: https://www.cnblogs.com/feichangnice/p/11935969.html

Mybatis动态传入tableName--非预编译(STATEMENT)

旧巷老猫 提交于 2019-12-05 04:47:44
在使用Mybatis过程中,你可以体会到它的强大与灵活之处,由衷的为Mybatis之父点上999个赞!在使用过程中经常会遇到这样一种情况,我查询数据的时候,表名称是动态的从程序中传入的,比如我们通过mybatis的xml文件写sql查询时都是下面的样子: 1、正常的查询 1 2 3 <select id= "activityEnrollModelTableName" parameterType= "java.util.HashMap" resultType= "java.util.HashMap"> SELECT * FROM user WHERE userid = # </select> 上面的查询语句用mybatis执行时,其实是自动的按照JDBC的预编译语句方式执行的,等同于下面一段JDBC代码的执行过程 1 2 3 4 5 6 7 8 9 Class.forName( "com.mysql.jdbc.Driver"); Connection conn = DriverManage.getConnection( "jdbc:mysql://localhost:3306/dbname", "root", "112233"); PreparedStatement preState = conn.prepareStatement( "SELECT * FROM user WHERE

编译的整个过程:预编译、编译、汇编、链接

て烟熏妆下的殇ゞ 提交于 2019-12-05 02:33:20
编译分为四个步骤: 每个步骤将文件编译成别的格式,如下: 详解: 1.预编译: 预编译过程主要做4件事: ①展开头文件 在写有#include <filename>或#include "filename"的文件中,将文件filename展开,通俗来说就是将fiename文件中的代码写入到当前文件中; ②宏替换 ③去掉注释 ④条件编译 即对#ifndef #define #endif进行判断检查,也正是在这一步,#ifndef #define #endif的作用体现出来,即防止头文件被多次重复引用 2.编译 将代码转成汇编代码,并且在这个步骤中做了两件很重要的工作: ①编译器在每个文件中保存一个函数地址符表,该表中存储着当前文件内包含的各个函数的地址; ②因为这步要生成汇编代码,即一条一条的指令,而调用函数的代码会被编译成一条call指令,call指令后面跟的是jmp指令的汇编代码地址,而jmp指令后面跟的才是“被调用的函数编译成汇编代码后的第一条指令”的地址,但是给call指令后面补充上地址的工作是在链接的时候做的事情。 3.汇编 将汇编代码转成机器码 4.链接 编译器将生产的多个.o文件链接到一起生成一个可执行.exe文件; 但是在这个过程中,编译器做的一个重要的事情是将每个文件中call指令后面的地址补充上;方式是从当前文件的函数地址符表中开始找,如果没有

JS学习笔记 之 预编译

橙三吉。 提交于 2019-12-03 15:13:58
1. imply global 暗示全局变量 :任何变量,未经声明就赋值,此变量为全局对象(window)所有 例: a = 10; --> window.a = 10;  (不管此变量是在全局赋值的,还是局部赋值的) 2. 一切 声明的全局变量 都是window的属性 --> window即全局的 var b = 123; --> window.b = 123; --> window { b: 123 //在全局对象中新加了一个属性 } 预编译发生在函数执行的前一刻 --> 解释一句,执行一句 函数体预编译过程: 1. 创建AO对象(Activation Object)--> 生成执行期上下文 2. 找形参和变量声明,将形参和变量声明作为AO对象的属性名,值为undefined 3. 将实参和形参值统一 4. 在函数体里找函数声明,作为GO对象的属性名,值为函数体 -->   注意:函数表达式 ≠函数声明 全局预编译过程: 1. 生成GO对象(Global Object)=== window 2. 找变量声明,作为GO对象的属性名,值为undefined 3. 找函数声明,作为GO对象的属性名,值为函数体 来源: https://www.cnblogs.com/seveinn/p/11801775.html

js学习笔记- 05 - 预编译

匿名 (未验证) 提交于 2019-12-03 00:22:01
1.js运行三部曲 语法分析、预编译、解释执行 2.预编译(函数声明整体提升,变量声明提升) function test() { console.log(123)} ------------------------------------------- function test() { console.log(123)} ------------------------------------------- var a = 123; // 123 -------------------------------------------- // undefined var a = 123; --------------------------------------------- --------------------------------------------- 3. 预编译前奏 imply global暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有。 一切声明的全局变量,全是window的属性 4.预编译四部曲 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 将实参和形参统一 在函数体内找函数声明,值赋予函数体 文章来源: js学习笔记- 05 - 预编译

js预编译AO对象及GO对象

匿名 (未验证) 提交于 2019-12-03 00:22:01
简单谈一下js的预编译过程。 function test(a,b){ console.log(a) var a=123; function a(){} console.log(b) var b=234; console.log(b) function b(){} console.log(a) var b=function(){} console.log(b) } test(1) 我先说一下打印结果,结合实例给大家讲一下我对预编译的理解。 fn-a fn-b 234 123 fn-b 首先js的执行过程会先扫描一下整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有错误的话,开始从上到下解释一行执行一行。 但是js中首先你要清楚变量声明和函数声明是会提升的。 计算机执行到test()函数时,在执行的前一刻会创建一个ao对象。 ao{ } 这是第一步,创建一个ao对象,第二步是将函数内所有的形参和变量声明储存到ao对象中,value为undefined; ao{ a:undefined, b:undefined } 第三步将形参和实参进行统一。 ao{ a:1, b:undefined } 第四步将所有的函数声明的函数名作为ao对象中的key,函数整体内容作为value,存储到ao对象中 ao{ a:function(){}, b:function(){} }

JDBC预编译statement(preparedstatement)和statement的比较、execute与executeUpdate的区别

匿名 (未验证) 提交于 2019-12-02 23:57:01
和 Statement一样,PreparedStatement也是用来执行sql语句的 与创建Statement不同的是,需要根据sql语句创建PreparedStatement 除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class TestJDBC { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } String sql = "insert into hero values(null,?,?,?)"; try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root",