激活条件编译(高分求帮忙解决下delphi错误)

本文目录
- 高分求帮忙解决下delphi错误
- C++中怎样写宏定义
- 做的网页在ie上显示正常但是在google上出错,于是在网上抄一份检验一下也出现同样问题
- 我在做html5新标签兼容IE浏览器,引用了谷歌提供的js文件还是没效果,应该怎么解决,求大神帮忙
- 而且我已经下载也安装了 可当登陆时就会提示 未绑定手机 不能用此方式验证 和IE浏览器需要修复 总之登陆不
高分求帮忙解决下delphi错误
由Borland公司推出的Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-Oriented Language)、当今世界上最快的编译器、最为领先的数据库技术。对于广大的程序开发人员来讲,使用Delphi开发应用软件,无疑会大大地提高编程效率,而且随着应用的深入,您将会发现编程不再是枯燥无味的工作——Delphi的每一个设计细节,都将带给您一份欣喜。 Delphi是Borland公司研制的新一代可视化开发工具,可在Windows3.x、Windows95、WindowsNT、WindowsXP、Windows Vista等环境下使用。当前,DELPHI 也可以在LINUX平台上开发应用,其在LINUX上的对应产品Kylix。 DELPHI 拥有一个可视化的集成开发环境(IDE),采用面向对象的编程语言ObjectPascal和基于部件的开发结构框架。Delphi它提供了500多个可供使用的构件,利用这些部件,开发人员可以快速地构造出应用系统。开发人员也可以根据自己的需要修改部件或用Delphi本身编写自己的部件。 “真正的程序员用c,聪明的程序员用Delphi”,这句话是对Delphi最经典、最实在的描述。Delphi被称Delphi界面为第四代编程语言,它具有简单、高效、功能强大的特点。和VC相比,Delphi更简单、更易于掌握,而在功能上却丝毫不逊色;和VB相比,Delphi则功能更强大、更实用。可以说Delphi同时兼备了VC功能强大和VB简单易学的特点。它一直是程序员至爱的编程工具。 Delphi具有以下的特性:基于窗体和面向对象的方法,高速的编译器,强大的数据库支持,与Windows编程紧密结合,强大而成熟的组件技术。但最重要的还是Object Pascal语言,它才是一切的根本。 Object Pascal语言是在Pascal语言的基础上发展起来的,简单易学。 Delphi提供了各种开发工具,包括集成环境、图像(Image Editor),以及各种开发数据库的应用程序,如DesktopDataBase Expert等。除此之外,还允许用户挂接其它的应用程序开发工具,如Borland公司的资源器(Resourse Workshop)。 在Delphi众多的优势当中,它在数据库方面的特长显得尤为突出:适应于多种数据库结构,从客户机/服务机模式到多层数据结构模式;高效率的数据库管理系统和新一代更先进的数据库引擎;最新的数据分析手段和提供大量的企业组件。 Delphi发展至今,从Delphi1、Delphi2到现在的Delphi2007,不断添加和改进各种特性,功能越来越强大。Delphi5开始添加了对IDE(集成开发环境)的很多改进新特性,扩展了数据库支持(ADO和InterBase数据库),带有Internet支持的MIDAS改进版,TeamSouse版本控制工具,转换功能,框架概念以及很多的新组件与新特性。 Delphi 6.0是Borland公司最新推出的一套无论是界面还是功能都近乎完美的应用程序开发工具。与以前的Delphi版本相比,Delphi 6.0使用更简便,效率也更高。 Delphi2010内置的Direct 2D模块及开发库,其新加的功能:拥有一个能同时运作于x86和x64的IDE,在此IDE下将会有跨平台编译器,能够编译用于linux和MAC的应用程序;将会支持windows7下的触摸式编程;强化的DataSnap;将支持云计算;将支持函数式编程,这需要很多时间,据David估计是2011会实现。
(1)直接编译生成可执行代码,编译速度快。由于Delphi编译器采用了条件编译和选择链接技术,使用Delphi界面它生成的执行文件更加精炼,运行速度更快。在处理速度和存取服务器方面,Delphi的性能远远高于其他同类产品。 (2)支持将存取规则分别交给客户机或服务器处理的两种方案,而且允许开发人员建立一个简单的部件或部件集合,封装起所有的规则,并独立于服务器和客户机,所有的数据转移通过这些部件来完成。这样,大大减少了对服务器的请求和网络上的数据传输量,提高了应用处理的速度。 (3)提供了许多快速方便的开发方法,使开发人员能用尽可能少的重复性工作完成各种不同的应用。利用项目模板和专家生成器可以很快建立项目的构架,然后根据用户的实际需要逐步完善。 (4)具有可重用性和可扩展性。开发人员不必再对诸如标签、按钮及对话框等Windows的常见部件进行编程。Delphi包含许多可以重复使用的部件,允许用户控制Windows的开发效果。 (5)具有强大的数据存取功能。它的数据处理工具BDE(BorlandDatabaseEngine)是一个标准的中介软件层,可以用来处理当前流行的数据格式,如xBase、Paradox等,也可以通过BDE的SQLLink直接与Sybase、SQLServer、Informix、Oracle等大型数据库连接。 Delphi既可用于开发系统软件,也适合于应用软件的开发。 (6)拥有强大的网络开发能力,能够快速的开发B/S应用,它内置的IntraWeb和ExpressWeb使得对于网络的开发效率超过了其他任何的开发工具。 (7)Delphi使用独特的VCL类库,使得编写出的程序显得条理清晰,VCL是现在最优秀的类库,它使得Delphi在软件开发行业处于一个绝对领先的地位。用户可以按自己的需要,任意的构建、扩充、甚至是删减VCL,以满足不同的需要。 (8)从Delphi8开始Delphi也支持.Net框架下程序开发。 当前DELPHI 已经成为一个品牌,而不仅仅是一个开发平台或开发语言的名称。 当前DELPHI产品已经由CodeGear公司继续发展,该公司是BORLAND公司的全资子公司。当前,CodeGear为广大开发者提供了DELPHI FOR PHP,以高度可视化的方式全面支持面向对象的PHP 网站开发,大大提高了PHP开发网站的代码复用程度,成为WEB应用开发的新利器。
1995 1.0 支持16位Windows开发。基于框架(VCL)的,可拖曳、可视化的开发环境 1996 2.0 以32位编译器为核心,支持C/S数据库开发 1997 3.0 语法:加入接口(Interface)的机制。IDE:首次提供了(Code Insight) 1998 4.0 语法:加入动态数组和方法覆盖等支持。IDE:增强调试能力,提供代码模板 1999 5.0 增强了IDE和调试器,提供了TeamSource。简化Internet的开发,增强数据库支持 2001 6.0 提供了Web Service。跨平台的Kylix 1.0和CLX 2002 7.0 提供了.NET的过渡,增强的Internet开发(IntraWeb),完善数据库支持,增加了Indy网路元件和Rave Report资料库报表,并且支援UML及XP的程式制作。 2003 8.0 单纯的for .NET版本,拥有C#的能力,保留了Delphi的易用性(业内视为一个过渡版本) 2004 9.0 正式名称:Delphi 2005。语法:加入了inline及for in loop等功能。IDE:把Borland Delphi.Net、Borland Delphi Win32、Borland C#、Enterprise Core Objects等环境和功能集成成一个开发工具,因此可以在Win32和.NET开发环境中切换或同时进行 2005 10.0 发布名称:Borland Developer Studio(BDS) 2006。集成C++ Builder; ECO(Enterprise Core Objects)升级到ECO III; 集成Together for Delphi,可以在同一个IDE中进行UML开发;QA Audits和QA Metrics可以快速的把握专案的设计和代码的质量。 2006 Turbo Borland将BDS 2006拆分成几个独立的版本(Delphi for win32、Delphi for .net、C#、C++ Builder),而且不能同时安装两个不同的版本。由于Borland的IDE生产部份独立成为一家名为codegear的公司,所以这个版本是以Borland名义推出的最后一个版本。 2007 11.0 正式名称:CodeGear RAD Studio - Delphi 2007。 2008 5.7 Borland正式宣布将CodeGear子公司出售给Embarcadero(易博龙)技术公司。 2008 8.25 Embarcadero发布CodeGear Delphi 2009 Pre-release版。 2009 8.25 Embarcadero发布CodeGear.RAD.Studio.2010版
Delphi的安装与其它应用软件并无不同。2.0版必须在Windows 95以上的操作系统中使用。启动Delphi软件Windows 95或Windows NT后,将Delphi的光盘放入光驱(CD-ROM)中,运行光盘上的\INSTALL\SETUP.EXE文件,它的安装程序会提示您正确地装入Delphi。如果您是在微软中文Windows环境中安装Delphi,请参照附录A来设置您的BDE环境,以便于处理中文数据。 为避免隐藏在Delphi后的Program Manager和曾经运行过的其它程序扰乱版面,分散您的注意力,不妨在启动Delphi前关掉其它应用程序;启动Delphi后,再最小化隐藏在后面的Delphi 2.0程序组。这样屏幕上就只留下Delphi窗口可见了。 首次加载Delphi,屏幕上会出现四个窗口: 标题为“Delphi-Project1”的Delphi主窗口 Object Inspector窗口 标题为“Form1”的窗体(Form)窗口 标题为“Unit1.PAS”的代码窗口。刚启动时这一窗口的大部分被“Form1”窗体所掩盖。将“Form1”窗体移开,或单击Form1窗体下方的状态行,可以使其全部可见。在“Form1”窗体的任意可见位置单击鼠标,可以恢复主窗体可见。 Delphi的主窗口位于屏幕的上端,包括Menu(菜单)、Speed Bar(加速条)和Component Panel(部件选项板)。Menu是下拉式主菜单。Speed Bar位于主窗口的左下端,由两排共14个加速按钮组成。这些按钮是菜单功能的快捷方式,各种图标直观地表示了它能执行的动作。Component Panel由一行、若干页对象按钮所组成,利用它来选择需要的部件并将它放到窗体中去。 Object Inspector窗口含有两页:Properties页显示窗体中当前被选择部件的属性信息,并允许改变对象的属性;Events页列出了当前部件可以响应的事件。按动Object Inspector下端的“Events”页标签,使得Events页可见,这一定的事件后边的空白处,可以定义对象接受到相应事件时执行的动作。首次启动时,Object Inspector窗口显示的是当前窗体Form1的属性。Object Inspector根据对象属性的多少,决定是否有滚行显示。移动滚行条,可以查看当前对象的全部属性。 此外,Object Inspector上还有Object Selector(对象选择器),位于Object Inspector上方的下拉式菜单中。它显示了窗体上所有部件的名称和类型,也包含窗体本身。您可以用Object Selector很容易地在窗体的各个部件之间切换,也可以快速地回到窗体本身。当窗体中含有较多的对象时,您会发现这是切换对象尤其是回到窗体的最快捷途径。 想使Object Inspector一直可见,可将鼠标移到Object Inspector上,按动右键,以启动Object Inspector的弹出式菜单,将其设置为Stay On Top。这对初学者常是一个很重要的设置方式。
Forms窗口是开展大部分设计的工作区域。首次启动Delphi 2.0时显示的是窗体Form1。可以把部件放Delphi界面在窗体中,通过移动位置、改变尺寸等操作随心所欲地安排它们,以此来开发应用程序的用户界面。您可以把窗体想象成一个可以放置其它部件的容器。窗体上有栅格(Grids),供放置部件时对齐位置用,在程序运行时Grids是不可见的。 一个真正的应用程序可能有不止一个窗口,您可以选用不同的窗体进行设计。其它窗体可以是对话框(Dialog Box)、数据录入框等。 代码窗口一开始处于窗体窗口之下。因为在Delphi中,设计用户界面直接在窗体中进行,运行结果和设计样板完全一致。当部件被放到窗体上时,Delphi会自动生成大部分的用户界面代码。您所应做的只是在它为您生成的框架中加入完成所需功能的程序段而已。点动Form1的状态行使代码窗口可见。 这个窗口中是代码器。可以在其中书写Delphi应用程序的源代码。当程序中含有不止一个窗口时,会有几个库单元的源程序出现在代码器中。代码器的标题条中显示了当前正在的库单元文件名。要查看某一特定程序的源代码,只需用鼠标点动写有该库单元文件名的页标签,就可以对该库单元进行了。
从空白窗体开始工作。将设计一个简单的程序:在屏幕上开一个窗口,窗口中有一个图框,用三个按钮Delphi界面来改变图框的形状;再用一个图标按钮来进行图框的颜色设置,通过颜色对话框来选择变成哪一种颜色。 在菜单上选用File|New Application菜单项来生成新的工程文件。这时,屏幕上出现窗体。 部件(Component)是建立Delphi应用程序的要素。Delphi为用户提供了丰富的部件库,既有可视的部件(如框、按钮)等,也有不可视的部件(如系统定时器、数据表等)。它们按照功能分别排列在Component Panel的各页上。 移动鼠标到Component Panel上,在部件按钮上“犹豫”一、两秒钟,一个黄色小提示框就会弹出,写有该部件的名称,称之为提示(Hint)。在要选择的部件上单击左键,则该部件按钮被按下,表示部件已被当前选择。然后,将鼠标移动到窗体上,按下左键,该部件被放到窗体中。部件的轮廓线上会显现八个被称为尺寸调整器(Sizing Handles)的黑色小方块。它除了供用户调整尺寸使用之外,还可以表示该对象处于当前状态。此时,按“Delete”键可以将该部件删除。 在Component Panel上,点动写有“Additional”的页标签,切换到Additional页,再移动鼠标,逐个用观看Hint的办法查看部件的名称,找到“Shape”部件(其图标为圆、方形、三角形三个几何体),将其放到窗体的左方。再按动“Standard”页标签,找到“Button”部件(图标上画有OK按钮)。Delphi允许在添加多个同类型的部件时,不必每次到部件选项板上选取。按住“Shift”键,同时在“Button”部件上单击鼠标左键,这时“Button”部件处于按下状态,并有蓝色边框,表示已经被选择固定。依次在窗体右方的三个位置单击左键,则会放置三个相同的Button部件。把鼠标光标移到部件选项板左侧的箭头图标处,这是“取消选择”按钮,它没有提示。按动它,会发现“Button”部件按钮恢复弹起状态。否则,每次“Form1”上的鼠标单击左键动作,都会导致增加一个按钮部件。 再次进入“Additional”部件页,选择一个“BitBtn”按钮(图标是有绿色对号的OK按钮),把它放到其它三个按钮部件的下面。 点动“Dialog”页标签,选择以16色网格做图标的ColorDialog部件并把它放到窗体的任意位置。因为这一部件是不可视部件,所以它的位置并不影响大局。
一般来讲,此时放置到窗体的部件是分散排列的,而且其大小不是真正需要的尺寸。除了不可视的Delphi界面ColorDialog部件外,其它的部件都需要进行位置、大小和显示字样的调整。Delphi提供的对齐工具和窗口栅格为这些调整提供了方便。 移动部件:只需把鼠标落到想移动的部件上,按住左键并移动光标,到合适的位置再释放左键,整个部件即被移到新位置。 调整尺寸:先把鼠标光标移动到要改变尺寸的部件上,单击左键,选中该部件,尺寸调整器会出现,把鼠标移动到其中的一个小黑色方块上,当鼠标变成拖动方向指示时,按下并拖动鼠标左键,可以放大或缩小部件。上下左右的小方块用来移动对应的各边,四个角的方块可以移动相连的两条边。如果要精确地表述部件的尺寸,可以在Object Inspector上,改变Left(表示部件左边缘到窗体左边框的象素点数)、Top(表示窗体上边框到部件上边缘的象素点数)、 Width(部件本身的宽度)、Height(部件本身的高度)等属性。关于改变部件的属性,下文还将仔细讲解。 使得一组部件对齐:用调整位置的方法可以对齐部件,但操作步骤复杂。Delphi提供的对齐工具可以使多个部件的对齐极为迅速方便。下面来使四个按钮对齐。先将四个按钮选为一组:按住并向右下方拖动鼠标左键,在窗体上画出围绕四个按钮的矩形,释放左键后,被选中的按钮周边会出现暗灰色的边框。选用Edit|Align命令,或使用弹出式菜单(在被固定的部件上单击鼠标右键激活),可以显示图1.4所示的对话框。 要使按钮沿左边对齐并使它们在垂直方向上均匀分布,先在Alignment对话框的Horizontal栏内选择“Left sides”,在“Vertical”栏内选择“Space equally”,按动OK按钮,Delphi就会自动将它们对齐。然后,您可以将它们四个作为一组来移动。在四个按钮以外的窗体上按动鼠标左键,就释放了组中的部件,使它们成为分立的部件。 利用对齐模板来对齐部件也是很方便的。首先要将要对齐的部件选成一组,选择View|Alignment Palette显示对齐模板。按照所示的方式选择即可达到对齐的目的。
如果部件已经对齐,为防止不小心移动部件,可以将部件位置锁定。选择主菜单上的Edit|LockDelphi界面Controls选项,使得部件不能进行移动操作。解锁只需再次选择此项即可。 调整“Shape”部件的大小,使之与右边的按钮组相匹配。再改变窗体的大小,按住并拖动窗体右下方使之刚好包容窗体上的全部部件。这样,您的用户界面就会比较美观。及时地保存所做的工作至关重要。对设计者来讲,有两个文件需要保存:库单元文件(以.PAS为后缀)和工程文件(以.DPR为后缀)。从主菜单上选择File|Save Project As...项,Delphi会显示标题为“Save Unit1 As”的文件保存对话框,Delphi 2.0 允许用户更改存储路径,您可以在下拉式列表框中选择。最好将您的文件保存在自己的目录中。在框中键入demoform.pas以保存库单元文件;然后显示标题为“Save Project As”的另一个文件保存对话框,键入sample.dpr。Delphi保存这两个文件并返回窗体窗口。不要把库单元和工程存成一样的文件名,Delphi要求两者不同。 第一次保存后,以后可以随时通过Speed Bar中的“Save All”和“Save file”来保存工程文件和库单元文件。一般来讲,当确认文件的改变后,要同时存储这两个文件。 运行工程:操作使您有了一个自己的应用程序界面。在速度条中按动“Run”按钮(绘有绿色三角图标),您可以看到,所生成的界面与您设计的界面是完全一致的。 改变对象的属性:上述的工程虽能够运行,但它对您的按动按钮操作是没有什么反应的,而且,所有部件上还写着不需要的字样。双击窗口的关闭按钮结束运行,回到设计界面。下面,将仔细讲述如何在Object Inspector中改变部件的各种属性。 用Properties页改变部件的属性值:首先要改变各种部件的标题。先给窗口命名为“Demo”。按动Object Inspector上端的Object Selector的题条或者其右端的下拉标志,找到Form1项,并点动左键,窗体被选中。在Object Inspector的Properties页中,找到Caption属性并用左键选中,将其右端的Form1改为Demo,同时,您会发现窗体的标题已经相应地做了改变。 用鼠标点中窗体中的Shape部件,Object Inspector列出了它的属性。选中Shape属性,您会发现右端出现了下拉标志。点动这一标志,可以查看对象的Shape属性可选值。它的形状可以是矩形、圆形、圆角矩形、方形等几种。这是设计后续功能的基础。 选中Button1按钮,此时Object Inspector已经显示出此按钮的一应属性。将它的Caption属性改为“&Rectangle”,“&”号使得Delphi特殊处理它后面的字符,在这里,按钮中的R字母被做了下划线处理,运行时,可以用“Alt-R”热键来按动这一按钮。同样,您可以将其它的两个按钮Button2和Button3的Caption属性改成需要的形状指示,譬如“&RoundRec”、“&Ellipse”。可以把某个按钮作为窗口上的缺省按钮,Delphi会为按钮加上有黑色的边缘。运行时,回车即相当于被按下。只需将此按钮的Default属性从False改成True,即将它设为窗体的缺省按钮。点动Default属性,在右端的值后面双击左键,或从下拉菜单中选取True,即可改变这一属性。Delphi中有许多只有True、False两个属性的部件,双击左键可以在这两个值之间切换。
Delphi的编程语言是以Pascal为基础的。Pascal语言具有可读性好、编写容易的特点,这使得它很适Delphi界面合作为基础的开发语言。同时,使用编译器创建的应用程序只生成单个可执行文件(.EXE),正是这种结合,使得Pascal成为Delphi这种先进开发环境的编程语言。 本章中,将讨论ObjectPascal的主要特点,并讲解如何在事件处理过程和其他应用程序中,使用它来编制程序代码。本章将讲解Delphi应用程序中最常用的ObjectPascal语法,而不是Pascal语言的一切细节。如果您完全不熟悉Pascal编程,请参阅一些基础的Pascal教程。如果您具有编程经验,并能熟练地使用其他流行程序语言,您将在本章的ObjectPascal中发现一些相同的概念。如果您已经熟悉了BorlandPascal,就可以快速浏览或跳过本章。 编写ObjectPascal程序代码 在前边的章节中,通过例程,已经编写了几行简单的代码。在本章中,将从熟悉Pascal编程的角度,配合实例,讲解ObjectPascal编程的基本方法。 在编写自己的ObjectPascal程序时,要注意程序的可读性。Pascal语言是英式结构语言,在程序中选择合适的缩排、大小写风格,并在需要时将程序代码分行,会使得程序代码能够很容易地被自己和他人读懂。一般的程序员都有这样的体验:如果不给程序加上适当的注解,一段时间后,自己也难以理清程序的流程。给程序及时地加上注释是良好的编程习惯。Delphi的注释需要加注在{}之间,器会把它们处理成为空白。Delphi保留了BorlandPascal器的风格,关键字采用黑体字,被注释的部分会变暗,这使得编程风格良好,易读易写。
你明白了么? 吗的累死我了
C++中怎样写宏定义
C/C++中宏使用总结
.C/C++中宏总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程
序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。
ANSI标准定义的C语言预处理程序包括下列命令:
#define,#error,#i
nclude,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。
1、#define
命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏
替换。命令的一般形式为:
#define identifier string
注意:
? 该语句没有分号。在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。
? 宏名定义后,即可成为其它宏名定义中的一部分。
? 宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。例如: #define XYZ
this is a test,使用宏printf("XYZ");//该段不打印"this is a test"而打印"XYZ"。因为预编译器识
别出的是"XYZ"
? 如果串长于一行,可以在该行末尾用一反斜杠’ \’续行。
2、#error
处理器命令#error强迫编译程序停止编译,主要用于程序调试。
3、#i nclude
命令#i nclude使编译程序将另一源文件嵌入带有#i nclude的源文件,被读入的源文件必须用双引号或尖括号括起来。例如:
#i nclude"stdio.h"或者#i nclude
这两行代码均使用C编译程序读入并编译用于处理磁盘文件库的子程序。
将文件嵌入#i nclude命令中的文件内是可行的,这种方式称为嵌套的嵌入文件,嵌套层次依赖于具体实现。
如果显式路径名为文件标识符的一部分,则仅在哪些子目录中搜索被嵌入文件。否则,如果文件名用双引号括起来,则首先检索当前工作目录。如果未发现文件,
则在命令行中说明的所有目录中搜索。如果仍未发现文件,则搜索实现时定义的标准目录。
如果没有显式路径名且文件名被尖括号括起来,则首先在编译命令行中的目录内检索。
如果文件没找到,则检索标准目录,不检索当前工作目录。
4、条件编译命令
有几个命令可对程序源代码的各部分有选择地进行编译,该过程称为条件编译。商业软件公司广泛应用条件编译来提供和维护某一程序的许多顾客版本。
#if、#else,#elif及#endif
#if的一般含义是如果#if后面的常量表达式为true,则编译它与#endif之间的代码,否则跳过这些代码。命令#endif标识一个#if块的
结束。
#if constant-expression
statement sequence
#endif
跟在#if后面的表达式在编译时求值,因此它必须仅含常量及已定义过的标识符,不可使用变量。表达式不许含有操作符sizeof(sizeof也是编译
时求值)。
#else命令的功能有点象C语言中的else;#else建立另一选择(在#if失败的情况下)。
注意,# else属于# if块。
#elif命令意义与ELSE IF 相同,它形成一个if else-if阶梯状语句,可进行多种编译选择。
#elif 后跟一个常量表达式。如果表达式为true,则编译其后的代码块,不对其它#elif表达式进行测试。否则,顺序测试下一块。
#if expression
statement sequence
#elif expression1
statement sequence
#endif
在嵌套的条件编译中#endif、#else或#elif与最近#if或#elif匹配。
# ifdef 和# ifndef
条件编译的另一种方法是用#ifdef与#ifndef命令,它们分别表示"如果有定义"及"如果无定义"。
# ifdef的一般形式是:
# ifdef macroname
statement sequence
#endif
#ifdef与#ifndef可以用于#if、#else,#elif语句中,但必须与一个#endif。
5、#undef
命令#undef 取消其后那个前面已定义过有宏名定义。一般形式为:
#undef macroname
6、#line
命令# line改变__LINE__与__FILE__的内容,它们是在编译程序中预先定义的标识符。命令的基本形式如下:
# line number
其中的数字为任何正整数,可选的文件名为任意有效文件标识符。行号为源程序中当前行号,文件名为源文件的名字。命令# line主要用于调试及其它特殊
应用。
注意:在#line后面的数字标识从下一行开始的数字标识。
7、预定义的宏名
ANSI标准说明了C中的五个预定义的宏名。它们是:
__LINE__
__FILE__
__DATE__
__TIME__
__STDC__
如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序也许还提供其它预定义的宏名。
__LINE__及__FILE__宏指令在有关# line的部分中已讨论,这里讨论其余的宏名。
__DATE__宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。
源代码翻译到目标代码的时间作为串包含在__TIME__中。串形式为时:分:秒。
如果实现是标准的,则宏__STDC__含有十进制常量1。如果它含有任何其它数,则实现是非标准的。编译C++程序时,编译器自动定义了一个预处理名
字__cplusplus,而编译标准C时,自动定义名字__STDC__。
注意:宏名的书写由标识符与两边各二条下划线构成。
***隐藏网址***
8、C、C++宏体中出现的#,#@,##
宏体中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个
双引号。
而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变
量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那就可以使用:宏参数##
固定部分。当然还可以n个##符号连接 n+1个Token,这个特性也是#符号所不具备的。
#@的功能是将其后面的宏参数进行字符化。
9、C宏中的变参...
...在C宏中称为Variadic Macro,也就是变参宏。比如:
#define myprintf(templt,...) fprintf(stderr,templt,__VA_ARGS__)
或者#define myprintf(templt,args...) fprintf(stderr,templt,args)
第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏中,我们显式地命名变参为args,那么我们在宏定义中就可以
用args来代指变参了。同C语言的stdcall一样,变参必须作为参数表的最后有一项出现。当上面的宏中我们只能提供第一个参数templt时,C
标准要求我们必须写成: myprintf(templt,);的形式。这时的替换过程为:myprintf("Error!\n",);替换为:
fprintf(stderr,"Error!\n",).
这是一个语法错误,不能正常编译。这个问题一般有两个解决方法。首先,GNU CPP提供的解决方法允许上面的宏调用写成:
myprintf(templt);而它将会被通过替换变成: fprintf(stderr,"Error!\n",);
很明显,这里仍然会产生编译错误(非本例的某些情况下不会产生编译错误)。除了这种方式外,c99和GNU CPP都支持下面的宏定义方式:
#define myprintf(templt, ...) fprintf(stderr,templt, ##__VAR_ARGS__)
这时,##这个连接符号充当的作用就是当__VAR_ARGS__为空的时候,消除前面的那个逗号。那么此时的翻译过程如下:
myprintf(templt);被转化为: fprintf(stderr,templt);
这样如果templt合法,将不会产生编译错误。
10、#pragma的使用【转载】
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对
每个编译器给出了一个方法,在保持与C和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且
对于每个编译器都是不同的。
其格式一般为: #Pragma Para,其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常
重要的。其使用方法为:
#Pragma message("消息文本")
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。
假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法
#ifdef _X86
#Pragma message("_X86 macro activated!")
#endif
当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示"_
X86 macro activated!"。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。
(2)另一个使用得比较多的pragma参数是code_seg。格式如:
#pragma code_seg( )
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
(3)#pragma once (比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
(4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文
件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了
#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。
(5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体、外观的定义。
(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示4507和34号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error:164) // 把164号警告信息作为一个错误。
同时这个pragma warning 也支持如下格式:
#pragma warning( push )
#pragma warning( pop )
这里n代表一个警告等级(1---4)。
#pragma warning( push )保存所有警告信息的现有的警告状态。
#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。
#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。
(7)pragma comment(...)
该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的lib关键字,可以帮我们连入一个库文件。
(8)用pragma导出dll中的函数
传统的到出 DLL 函数的方法是使用模块定义文件 (.def),Visual C++ 提供了更简洁方便的方法,那就
是"__declspec()"关键字后面跟"dllexport",告诉连接去要导出这个函数,例如:
__declspec(dllexport) int __stdcall MyExportFunction(int iTest);
把"__declspec(dllexport)"放在函数声明的最前面,连接生成的 DLL 就会导出函
数"_MyExportFunction@4"。
上面的导出函数的名称也许不是我的希望的,我们希望导出的是原版的"MyExportFunction"。还好,VC 提供了一个预处理指示
符"#pragma"来指定连接选项 (不仅仅是这一个功能,还有很多指示功能) ,如下:
#pragma comment(linker,"/EXPORT:MyExportFunction=_MyExportFunction@4")
这下就天如人愿了:)。如果你想指定导出的顺序,或者只将函数导出为序号,没有 Entryname,这个预处理指示符 (确切地说是连接器) 都能够
实现,看看 MSDN 的语法说明:
/EXPORT:entryname
@ordinal 指定顺序;NONAME 指定只将函数导出为序号;DATA 关键字指定导出项为数据项。
⑨每个编译程序可以用#pragma指令激活或终止该编译程序支持的一些编译功能。例如,对循环优化功能:
#pragma loop_opt(on) // 激活
#pragma loop_opt(off) // 终止
有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,如"Parameter xxx is never used in function
xxx",可以这样:
#pragma warn -100 // Turn off the warning message for warning #100
int insert_record(REC *r)
{ /* function body */ }
#pragma warn +100 // Turn the warning message for warning #100 back
on
函数会产生一条有唯一特征码100的警告信息,如此可暂时终止该警告。
每个编译器对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。
⑩#pragm pack()的使用
#pragma pack规定的对齐长度,实际使用的规则是:
? 结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这
个数据成员自身长度中,比较小的那个进行。
? 也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
? 而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值之间,较小的那个进行。
注意:文件使用#pragma pack(n) 改变了缺省设置而不恢复,通常可以使用#pragma pack(push, n)和#pragma
pack(pop)进行设置与恢复。
注:关于宏函数的内容在另外的专题。关于宏使用的误区在描述宏的时候已经在文中提到了,最后再给出一个例子,描述的Side Effect是指宏在展开
的时候对其参数可能进行多次Evaluation(也就是取值)对程序造成的错误影响。
假设在一个系统中,有一个32b的寄存器(REG)保存状态,其中高16b表示一种含义,低16b表示另一种含义(这在程序中经常出现)。现在要把高低
16b分开,不考虑实际中的特殊要求,将代码写成:
#define High16bit(REG) (REG》》16)
#define Low16bit(REG) ((REG《《16)》》16)
对于这种写法完成的功能在大多数情况是足够了,这里不讨论。主要谈论这种写法的负面影响,如果在程序中分别在不同的语句中使用High16bit和
Low16bit,那么就可能那就是Side effect,特别寄存器REG是状态寄存器,他的状态可能随时变化,那么引起的问题就是高低16b根本
取的不是同一个时刻状态寄存器。这种错误在程序中找出就比较难了。在这里我把条件弱化了,试想在一个宏体中,如果对参数多次取值也是可能引起问题,那就 更难了。
做的网页在ie上显示正常但是在google上出错,于是在网上抄一份检验一下也出现同样问题
造成IE和其它浏览器崩溃的原因是很多的,像IE组件被破坏,或者硬件设备不支持物理加速等,都可能造成浏览器的异常崩溃,这个必须要找到原因手动
才容易修复,否则的话,手动修复是很麻烦的,建议你可以使用电脑管家电脑诊所提供的专业方案,一键就可以解决问题
附:手动修复步骤(来源:腾讯电脑管家电脑诊所,自动修复请点击上方的【立即修复】)
方案一:清除IE缓存
1. 打开IE浏览器→点击【工具】→ 【Internet 选项】→【删除】:
2. 勾选所有选项→点击【确定】→ 在确认窗口中点击【确定】(如使用其他浏览器,请用类似方法清除浏览器缓存)
方案二:注册IE组件
点击【开始】菜单→在搜索框中输入"cmd"→按键盘enter(回车)键:
在弹出的黑色窗口中,按顺序输入以下内容,按键盘enter(回车)键,再逐一完成以下全部部件注册:
regsvr32 atl.dll
regsvr32 shdocvw.dll
regsvr32 urlmon.dll
regsvr32 browseui.dll
regsvr32 oleaut32.dll
regsvr32 shell32.dll
regsvr32 jscript.dll
regsvr32 vbscript.dll
regsvr32 mshtmled.dll
regsvr32 CLBCATQ.DLL
regsvr32 cscui.dll
regsvr32 MLANG.dll
regsvr32 stobject.dll
regsvr32 WINHTTP.dll
regsvr32 msxml3.dll
regsvr32 query.dll
regsvr32 jscript9.dll
regsvr32 hlink.dll
建议点击本回答上侧【立即修复】按钮,使用电脑诊所一键自动完成所有修复步骤。
方案三:修复注册表
1. 点击【开始】菜单→在搜索框中输入"regedit"→按键盘enter键:
2. 定位到\HKEY_ROOT\IE.HTTP\shell ,双击打开右侧【(默认)】将默认值设置为空→点击【确定】:
3. 根据前2个步骤,依次设置如下注册表项
3.1 . 设置\HKEY_CLASSES_ROOT\IE.HTTP\shell\open\command 默认值为""C:\Program Files\Internet Explorer\iexplore.exe" -nohome " (64位系统则,设置为"\%ProgramFiles(x86)%\Internet Explorer\iexplore.exe -nohome")(不包括最外层的双引号) 类型为REG_SZ
3.2. 设置\HKEY_CLASSES_ROOT\IE.HTTP\shell\open\ddeexec 默认值为""%1",,-1,0,,,, "(不包括最外层的双引号) 类型为REG_EXPAND_SZ
3.3.设置\HKEY_CLASSES_ROOT\IE.HTTP\shell\open\ddeexec\Application 默认值为"IExplore " (不包括最外层的双引号) 类型为REG_SZ
3.4.设置\HKEY_CLASSES_ROOT\IE.HTTP\shell\open\ddeexec\Topic 默认值为"WWW_OpenURL" (不包括最外层的双引号) 类型为REG_SZ
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
方案四:调低cookie隐私等级
打开IE浏览器 → 点击【工具】→【Internet 选项】
点击【隐私】→将【选择Internet 区域设置】调为【中】→点击【确定】:
方案五:关闭GPU加速(适用于IE9以上版本)
打开IE浏览器 → 点击【工具】→【Internet 选项】
点击【高级】→勾选【使用软件呈现而不使用GPU呈现*】→点击【确定】:
如果以上诉步骤未能生效,再进入后续步骤:
方案六:重置IE
(说明:如果您使用网络代理或者对浏览器有特殊设置,请保存设置后再进行操作)
打开IE浏览器 → 点击【工具】→【Internet 选项】
点击【高级】→点击【重置】→勾选【删除个性化设置】→点击【确定】→【确定】:
方案七:修复IE浏览器
1. 打开【电脑管家】→选择【软件管理】→点击【软件仓库】→输入"Internet Explorer"开始搜索→点击【修复】(IE8以下的版本可以直接点击【下载】):
2. 安装时根据提示选择【我不想立即参与(O)】→点击【下一步(N)】→点击【我同意(A)】
不勾选【安装更新(I)】→【下一步(N)】→点击【立即重新启动(推荐)(H)】
方案八:安装其他浏览器后设置其他浏览器为默认浏览器
打开电脑管家→点击【软件管理】,在搜索框中输入"谷歌浏览器"→找到软件后点击安装
打开电脑管家→点击【工具箱】,点击【默认程序设置】→在上网浏览器列表中选择【谷歌浏览器】:
注:腾讯电脑管家为IE浏览器出错崩溃问题定制部分修复步骤,因为操作过于繁杂,故未全部列出。若问题仍未解决,建议点击本回答上侧的【立即修复】按钮,进行深度修复。
以后有问题,欢迎来企业平台询问
我在做html5新标签兼容IE浏览器,引用了谷歌提供的js文件还是没效果,应该怎么解决,求大神帮忙
HTML5是用于取代1999年所制定的HTML4.01和XHTML1.0标准的HTML(标准通用标记语言下的一个应用)标准版本;现在仍处于发展阶段,但大部分浏览器已经支持某些HTML5技术。HTML5有两大特点:首先,强化了Web网页的表现性能。其次,追加了本地数据库等Web应用的功能。
广义论及HTML5时,实际指的是包括HTML、CSS和JavaScript在内的一套技术组合。它希望能够减少浏览器对于需要插件的丰富性网络应用服务(plug-in-based rich internet application,RIA),如Adobe Flash、Microsoft Silverlight与Oracle JavaFX的需求,并且提供更多能有效增强网络应用的标准集。
目前HTML5已向开发人员提供了很多新的标签,如section,nav,article,header和footer等。这些标签语义化程度高,会被经常使用,但在IE6,IE7,IE8和Firefox 2等老式浏览器中却不能识别和正常使用。
一、HTML5标签在浏览器展示存在的问题
对于现阶段来说,使用HTML5标签可能遇到的最大问题就是如何在不支持新标签的浏览器中做恰当的处理。当我们在页面中使用HTML5元素时,可能会得到三种不同的结果。
结果1:标签被当作错误处理并被忽略。那么DOM构建的时候,就会当作这个标签不存在。
结果2:标签会被当作错误处理,并在DOM构建的时候依然会按照预期的代码进行创建,并且HTML标签会被构造成行内元素(也就是说虽然不能识别,但是代码里section标签依然会在dom中创建一个对应section节点,但是属于行内元素)。
结果3:标签被识别为HTML5标签,然后用DOM节点对其进行替换。DOM在构建的时候和预想的一致,并且合适的样式会应用到标签上(大部分情况下是块级元素)。
有一个具体的例子,大家思考一下下面的代码:
《div class="outer"》
《section》
《h1》title《/h1》
《p》text《/p》
《/section》
《/div》
很多浏览器(比如Firefox 3.6和Safari4)解析的时候都会将div作为最外层的元素,然后div里面是一个识别不了的元素(section),它会在DOM中创建,并被作为一个行内元素存在。h1和p元素都是作为section元素的子节点。因为section在DOM中真实存在,所以也可以修改其样式。这种情况对应结果2。
IE9之前的版本会认为section标签是一个错误,并直接将其忽略,那么h1和p标签会被解析,然后成为div标签的子节点。《/section》也会被认为是一个错误并直接跳过。在这些浏览器中实际有效的代码是这样的:
《div class="outer"》
《h1》title《/h1》
《p》text《/p》
《/div》
那么,旧版本的IE浏览器除了生成的DOM结构和其他浏览器不一样,其对不可识别标签的容错能力还是很棒的。因为section节点没有在DOM树中构建,所以也就不能给其增加样式。这种情况对应结果1。
当然,支持HTML5的浏览器比如IE9,Firefox4+,Safari5+会创建正确的DOM结构,然后这些标签会默认附带HTML5规范中定义的默认样式。
那么,我们所面临的最大问题就是同样的代码在不同的浏览器中形成了不同的DOM结构,并且含有不同的样式。
二、如何解决HTML5标签不兼容
或许会有很多人在质疑:为什么老式的浏览器不能识别这些标签?其实错不在浏览器,因为在那个时代根本不存在这种标签,所以不能正确识别出来,而这种不寻常的标签识别令DOM结构变得异常。对此,人们想出了很多在现阶段页面中使用HTML5元素的解决方案。每一个解决方案为了做到兼容都会遇到一些特定的问题。在此也在马海祥博客上跟大家分享一下:
1、实现标签被识别
马海祥曾做个一个测试(以IE8为例),是一个文章标题和蓝色字的文章内容,其中文章内容用了article标签。代码如下:
《!DOCTYPE html》
***隐藏网址***
《head》
《meta charset="UTF-8" /》
《title》测试《/title》
《style》
article{color:#06F;}
《/style》
《/head》
《body》
《h1》文章标题《/h1》
《article》
这是文章内容,应该是一段蓝色的文字。在老式浏览器中,如果不做hack将显示异常。
《/article》
《/body》
《/html》
在IE8浏览器中,显示如下:
IE8不能识别article标签, 定义在标签上的CSS样式没有起作用。 在IE8中,《article》被解释成命名为《article /》和《/article /》两个空的标签元素,与文章内容并列为兄弟节点,如下图所示:
既然因为不能识别标签而不能使用,那我们的解决办法就是让标签被识别出来。所幸,简单地通过document.createElement(tagName)即可以让浏览器识别标签和CSS引擎知道该标签的存在。假设我们上面的例子的《head》区域加上如下代码。
《script》
document.createElement(’article’);
《/script》
IE8浏览器中的DOM解释就会变成下图所示:
自然,文字也显示成正常的蓝色。如下图所示:
2、JavaScript解决方案
JavaScript解决方案目的是解决在旧版本的IE中样式应用的问题。老版本的IE不会识别不明元素已经是一个耳熟能详的特性,而如果这些元素已经通过document.createElement()创建,那么浏览器就可以识别这些标签,并可以将其在DOM树中构建,然后允许开发者对其应用样式。
这个方法可以确保HTML5标签能在旧版本IE中对应创建DOM节点,然后可以对其应用样式。这个方法将HTML5块级元素设置成display:block,从而可以在各个浏览器中做到兼容。
今天测试以下把马海祥博客的网页改成了HTML5的,调试了一下,在FF和Opera中都显示正常了,到了IE6上却变得面目全非了。对此我还特意去找了一些使用JS代码支持HTML5标签元素的方法,在此也跟大家分享一下:
(1)、使用html5shiv
查看了一下,发现了html5shiv能解决这个问题,可以把HTML5的新元素转换成IE6认识的内容。只需要在你的head中调用这段代码就行:
《!--if lt IE 9]》
***隐藏网址***
《!--》
当然你也可以直接把这个文件下载到自己的网站上。但这个文件必须在head标签中调用,因为IE必须在元素解析这前知道这些元素,才能启作用!但马海祥还要提醒你一下:还要在你的CSS文件中加上以下代码,不然有可能会出现些莫名其妙的问题。
header,nav,article,section,aside,footer{display:block;}
另外excanvas.js是Google为IE6支持canvas元素写的脚本,以后马海祥会跟大家再细说这样的例子,感兴趣的朋友可以去试试。
(2)、使用Kill IE6
除此之外你还可以使用KILL IE6一族,前提是你的浏览器允许执行JS文件。方法很简单,在你的网站的《/body》之前加上以下代码就可以了:
《!--if lte IE 6]》
***隐藏网址***
《!--》
上面写的《!--if lte IE 6]》在正常的HTML中属于注释,不会被执行,但在IE中是一个判断语句,所以这些代码只有在IE中才会被识别并加载。
lte:就是Less than or equal to的简写,也就是小于或等于的意思。
lt :就是Less than的简写,也就是小于的意思。
gte:就是Greater than or equal to的简写,也就是大于或等于的意思。
gt :就是Greater than的简写,也就是大于的意思。
! : 就是不等于的意思,跟javascript里的不等于判断符相同
说实话,马海祥不喜欢这个利用JavaScript解决的方案,因为它破坏了我最主要的web应用开发原则:我们不应该使用JavaScript来控制布局。不仅仅是因为这个做法给那些禁用脚本的用户带来了糟糕的用户体验,更重要的是,如果我们希望我们的web应用代码是面向未来,并且维护性高的,那么必须将视图相关部分分离出来。这个方案对在跨浏览器中构建相同的DOM结构很有帮助,也可以确保你的JavaScript和CSS在各个地方运行结果相同,但是这个优势并不能改变我对这个方法的不认同。
3、Namespace hack
永远不要缺乏使用hack解决问题的能力,在IE中还有其他技术来让浏览器识别不明的标签。这个来自Elco Klingen日志的方法一开始引起了广泛的关注。该技术包含了一个XML形式的命名空间,并使用了含有namespace前缀的元素。例如:
***隐藏网址***
《body》
《html5:section》
《!-- content --》
《/html5:section》
《/body》
《/html》
前缀html5是纯粹是用于这个例子而且也不是官方支持的,你甚至可以用"foo"作为前缀,结果还是一样。有了前缀之后,IE会识别新的元素,从而可以应用样式。在其他浏览器中一样有效,那么最后,你就成功地在各个浏览器中构建了一样的元素和一样的样式。
这个方法的缺陷很明显:你必须在HTML文档中使用XML格式的命名空间,同样,你也需要在css中这么做:
html5\:section {
display: block;
}
马海祥点评:这并不是我期望Web开发者编写代码的方式。虽然这是一个非常杰出的解决方案,但是这让应用变得不自然。我不希望看到文件中充满了带命名空间的元素。
4、Bulletproof技术(防弹衣技术)
说实话,我是第一次接触到这个技术,建议在所有新的HTML5块级元素中增加一个内部的div元素,然后包含一个CSS class,用这个元素来替代HTML元素(类似在里面穿了一件防弹衣),例如:
《section》
《div class="section"》
《!-- content --》
《/div》
《/section》
在应用样式的时候,Tantek推荐直接给div增加样式,而不是给新元素增加样式
推荐使用:
.section {
color: blue;
}
而不是:
section {
color: blue;
}
这个方案的原理是用简单的方式将原来的样式应用方式转移到一个代表了HTML5标签的元素上。由于我一般情况下不会将样式通过标签名的方式应用到元素上,所以马海祥也并完全支持这个建议。
马海祥觉得这个方案的缺陷是不同的浏览器构建了不同的DOM结构,那么你必须在编写JavaScript和CSS的时候格外小心。获取子节点或者父节点的时候,不同的浏览器返回的结果可能会不一样。特别是在下面的代码中:
《div class="outer"》
《section》
《div class="section main"》
《!-- content --》
《/div》《/section》
《/div》
5、反向的bulletproof技术
还有一些方法,比如尝试使用和Tanteck方案相反的技术,也就是把HTML5元素放在div元素内部,例如:
《div class="section"》
《section》
《!-- content --》
《/section》
《div》
这个方案唯一的不同是HTML5元素的位置,其他都一样。喜欢这个技术的支持者认为他的一致性很好(适用于所有的元素,包括《hgroup》)。但是DOM结构的不同让这个方案意义变得不大。他的主要优势是技术上的一致性。
6、关于X-UA-Compatible的使用
目前绝大多数网站都用以下代码来作为IE8的兼容方法。
***隐藏网址***
虽然微软将IE向标准迈进了一大步,而事实上IE8还存在一系列渲染的奇怪现象是不争的事实。
在X-UA-Compatible中可用的方法有:
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
其中最后一行是永远以最新的IE版本模式来显示网页的。
另外加上
***隐藏网址***
***隐藏网址***
而使用,Emulate模式后则更重视。
所以目前来说还是以使用
***隐藏网址***
为首选。
7、通过修改HTML部分来实现
我的主要目标是确保我只需要修改HTML部分。这就意味着不需要修改CSS和JavaScript。为什么会有这样的需求?需要修改的Web应用视图越多,你越有可能制造bug。将改变限制到一个视图也就限制了bug的出现,即使出现了bug,也可以减少你查找错误的范围。如果一个视图破相了,我可以知道这是因为我增加了一个section元素,而不是考虑是不是CSS文件修改来带的影响。
在研究了所有这些解决方案,并进行一些尝试和设计之后,我回到了Tantek的方案。这是唯一一个只需要修改HTML而不用动CSS和HTML的方案。现在,我在他的方案基础上做了一些改进,来达到我想要的结果。
首先,我不会给那些代表HTML5元素的class增加样式(所以我不会使用.section这样的选择器)。我保留了div元素,然后再增加一个带语义的class来应用样式,并作为进行JavaScript操作的钩子。例如,这样的代码:
《div class="content"》
《!-- content --》
《/div》
经过改进后:
《section》
《div class="section content"》
《!-- content --》
《/div》
《/section》
这样的修改完成后,我依然使用.content作为样式和脚本的入口。这也意味着我不需要修改CSS和JavaScript。
然后,为了避免hgroup标签这样的情况,我选择不使用这个标签。我在我已有的所有页面中没有找到任何一个使用了这个标签的。由于hgroup标签只能包含标题元素,如果你确实想要使用这个标签,那么使用hrgoup来包含本身是非常安全的(假设它没有包含其他的块级元素)。
我在马海祥博客上花了很多时间来测试比较bulletproof和反向的bulletproof哪个更好一些。我做选择时最主要的决定因素就是反向的bulletproof需要我去增加CSS代码。在那些为HTML5标签创建了DOM节点但是没有应用默认样式的元素来说,div元素里包含了一个HTML5块级元素在很多情况下都会搅乱我的布局,因为创建的DOM节点是行内元素。我不得不明确增加CSS规则来让这个节点变成块级元素从而可以正常布局,这也就违反了我不修改CSS文件的初衷。
马海祥博客点评:
在我的研究中,我使用了多个页面,然后在这些页面上使用修改过后的bulletproof技术。我分别在简单和复杂的布局中,含有和不含有JavaScript交互进行测试。在每一个例子中,我只需要修改HTML就可以让页面表现正确(不修改JavaScript和CSS)。那么,子节点和父节点的问题怎么办?有趣的事情是我在测试中并没有遇到这样的问题。
理由很简单,因为我对代码苛刻的态度。我认真地做了第二遍检查:
(1)、标签名和ID不会用于应用样式(只是用class)。
(2)、尽量选择常用的CSS选择器并且尽量减少选择器的使用。
(3)、JavaScript代码不依赖于特定的DOM结构。
(4)、标签名不用于操作DOM。
我注意到另一个有趣的事情是我使用了HTML5元素作为容器。而这些新的元素仅仅是作为功能性模块的边界。你应该花费你的大部分时间为内部的元素编写样式和脚本而不是处理各个模块间的样式和脚本。由于马海祥博客的JavaScript和CSS标签都应用在容器的内部,所以一切都显得很顺利。我想这才是一个真正的代码质量高的网站。
而且我已经下载也安装了 可当登陆时就会提示 未绑定手机 不能用此方式验证 和IE浏览器需要修复 总之登陆不
造成IE和其它浏览器崩溃的原因是很多的,像IE组件被破坏,或者硬件设备不支持物理加速等,都可能造成浏览器的异常崩溃,这个必须要找到原因手动
才容易修复,否则的话,手动修复是很麻烦的,建议你可以使用电脑管家电脑诊所提供的专业方案,一键就可以解决问题
附:手动修复步骤(来源:腾讯电脑管家电脑诊所,自动修复请点击上方的【立即修复】)
方案一:清除IE缓存
1. 打开IE浏览器→点击【工具】→ 【Internet 选项】→【删除】:
2. 勾选所有选项→点击【确定】→ 在确认窗口中点击【确定】(如使用其他浏览器,请用类似方法清除浏览器缓存)
方案二:注册IE组件
点击【开始】菜单→在搜索框中输入"cmd"→按键盘enter(回车)键:
在弹出的黑色窗口中,按顺序输入以下内容,按键盘enter(回车)键,再逐一完成以下全部部件注册:
regsvr32 atl.dll
regsvr32 shdocvw.dll
regsvr32 urlmon.dll
regsvr32 browseui.dll
regsvr32 oleaut32.dll
regsvr32 shell32.dll
regsvr32 jscript.dll
regsvr32 vbscript.dll
regsvr32 mshtmled.dll
regsvr32 CLBCATQ.DLL
regsvr32 cscui.dll
regsvr32 MLANG.dll
regsvr32 stobject.dll
regsvr32 WINHTTP.dll
regsvr32 msxml3.dll
regsvr32 query.dll
regsvr32 jscript9.dll
regsvr32 hlink.dll
建议点击本回答上侧【立即修复】按钮,使用电脑诊所一键自动完成所有修复步骤。
方案三:修复注册表
1. 点击【开始】菜单→在搜索框中输入"regedit"→按键盘enter键:
2. 定位到\HKEY_ROOT\IE.HTTP\shell ,双击打开右侧【(默认)】将默认值设置为空→点击【确定】:
3. 根据前2个步骤,依次设置如下注册表项
3.1 . 设置\HKEY_CLASSES_ROOT\IE.HTTP\shell\open\command 默认值为""C:\Program Files\Internet Explorer\iexplore.exe" -nohome " (64位系统则,设置为"\%ProgramFiles(x86)%\Internet Explorer\iexplore.exe -nohome")(不包括最外层的双引号) 类型为REG_SZ
3.2. 设置\HKEY_CLASSES_ROOT\IE.HTTP\shell\open\ddeexec 默认值为""%1",,-1,0,,,, "(不包括最外层的双引号) 类型为REG_EXPAND_SZ
3.3.设置\HKEY_CLASSES_ROOT\IE.HTTP\shell\open\ddeexec\Application 默认值为"IExplore " (不包括最外层的双引号) 类型为REG_SZ
3.4.设置\HKEY_CLASSES_ROOT\IE.HTTP\shell\open\ddeexec\Topic 默认值为"WWW_OpenURL" (不包括最外层的双引号) 类型为REG_SZ
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
方案四:调低cookie隐私等级
打开IE浏览器 → 点击【工具】→【Internet 选项】
点击【隐私】→将【选择Internet 区域设置】调为【中】→点击【确定】:
方案五:关闭GPU加速(适用于IE9以上版本)
打开IE浏览器 → 点击【工具】→【Internet 选项】
点击【高级】→勾选【使用软件呈现而不使用GPU呈现*】→点击【确定】:
如果以上诉步骤未能生效,再进入后续步骤:
方案六:重置IE
(说明:如果您使用网络代理或者对浏览器有特殊设置,请保存设置后再进行操作)
打开IE浏览器 → 点击【工具】→【Internet 选项】
点击【高级】→点击【重置】→勾选【删除个性化设置】→点击【确定】→【确定】:
方案七:修复IE浏览器
1. 打开【电脑管家】→选择【软件管理】→点击【软件仓库】→输入"Internet Explorer"开始搜索→点击【修复】(IE8以下的版本可以直接点击【下载】):
2. 安装时根据提示选择【我不想立即参与(O)】→点击【下一步(N)】→点击【我同意(A)】
不勾选【安装更新(I)】→【下一步(N)】→点击【立即重新启动(推荐)(H)】
方案八:安装其他浏览器后设置其他浏览器为默认浏览器
打开电脑管家→点击【软件管理】,在搜索框中输入"谷歌浏览器"→找到软件后点击安装
打开电脑管家→点击【工具箱】,点击【默认程序设置】→在上网浏览器列表中选择【谷歌浏览器】:
注:腾讯电脑管家为IE浏览器出错崩溃问题定制部分修复步骤,因为操作过于繁杂,故未全部列出。若问题仍未解决,建议点击本回答上侧的【立即修复】按钮,进行深度修复。
以后有问题,欢迎来企业平台询问

更多文章:
blast premier春季赛(csgo战队vitality有谁)
2026年9月7日 21:50
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20




