编译预处理命令令

关于预处理命令#pragma SAVE #pragma REGPARMS ...... #pragma RESTORE
[问题点数:40分,结帖人chenyanchi99]
关于预处理命令#pragma SAVE #pragma REGPARMS ...... #pragma RESTORE
[问题点数:40分,结帖人chenyanchi99]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年3月 Linux/Unix社区大版内专家分月排行榜第二2014年12月 Linux/Unix社区大版内专家分月排行榜第二2014年11月 Linux/Unix社区大版内专家分月排行榜第二2014年9月 Linux/Unix社区大版内专家分月排行榜第二2014年8月 Linux/Unix社区大版内专家分月排行榜第二2014年7月 Linux/Unix社区大版内专家分月排行榜第二2014年5月 Linux/Unix社区大版内专家分月排行榜第二2014年4月 Linux/Unix社区大版内专家分月排行榜第二
2014年3月 Linux/Unix社区大版内专家分月排行榜第三
2015年3月 Linux/Unix社区大版内专家分月排行榜第二2014年12月 Linux/Unix社区大版内专家分月排行榜第二2014年11月 Linux/Unix社区大版内专家分月排行榜第二2014年9月 Linux/Unix社区大版内专家分月排行榜第二2014年8月 Linux/Unix社区大版内专家分月排行榜第二2014年7月 Linux/Unix社区大版内专家分月排行榜第二2014年5月 Linux/Unix社区大版内专家分月排行榜第二2014年4月 Linux/Unix社区大版内专家分月排行榜第二
2014年3月 Linux/Unix社区大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。预处理命令 -
1.不带参数的宏定义:宏定义又称为宏代换、宏替换,简称“宏”。格式:#define标识符文本其中的标识符就是所谓的符号常量,也称为“宏名”。预处理(预编译)工作也叫做宏展开:将宏名替换为文本(这个文本可以是字符串、可以是代码等)。掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。即在对相关命令或语句的含义和功能作具体分析之前就要换:例:#define PI 3.1415926把程序中全部的标识符PI换成3.1415926说明:(1)宏名一般用大写(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义(3)可以用#undef命令终止宏定义的作用域(4)宏定义可以嵌套2.带参数的宏:除了一般的字符串替换,还要做参数代换格式:#define 宏名(参数表)文本例如:#define S(a,b) a*barea=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;类似于函数调用,有一个哑实结合的过程:(1)实参如果是表达式容易出问题#define S(r) r*rarea=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;正确的宏定义是#define S(r) ((r)*(r))(2)宏名和参数的括号间不能有空格(3)宏替换只作替换,不做计算,不做表达式求解(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存(5)宏的哑实结合不存在类型,也没有类型转换。(6)宏展开使源程序变长,函数调用不会(7)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
预处理命令 -
一个文件包含另一个文件的内容格式:#include "文件名"或#include 编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。编译以后只得到一个目标文件.obj被包含的文件又被称为“标题文件”或“头部文件”、“头文件”,并且常用.h作扩展名。修改头文件后所有包含该文件的文件都要重新编译头文件的内容除了函数原型和宏定义外,还可以有结构体定义,全局变量定义:(1)一个#include命令指定一个头文件;(2)文件1包含文件2,文件2用到文件3,则文件3的包含命令#include应放在文件1的头部第一行;(3)包含可以嵌套;(4)称为标准方式,系统到头文件目录查找文件,"文件名"则先在当前目录查找,而后到头文件目录查找;(5)被包含文件中的静态全局变量不用在包含文件中声明。
预处理命令 -
有些语句希望在条件满足时才编译。格式:(1)#ifdef 标识符程序段1#else程序段2#endif或#ifdef程序段1#endif当标识符已经定义时,程序段1才参加编译。格式:(2)#ifndef 标识符格式:(3)#if 表达式1程序段1#elif 表达式2程序段2……#elif 表达式n程序段n#else程序段n+1#endif当表达式1成立时,编译程序段1,当不成立时,编译程序段2。使用条件编译可以使目标程序变小,运行时间变短。预编译使问题或算法的解决方案增多,有助于我们选择合适的解决方案。此外,还有布局控制:#pragma,这也是我们应用预处理的一个重要方面,主要功能是为编译程序提供非常规的控制流信息。
为本词条添加和相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
您也可以使用以下网站账号登录:
此词条还可添加&
编辑次数:11次
参与编辑人数:9位
最近更新时间: 21:06:13
贡献光荣榜
扫描二维码用手机浏览词条
保存二维码可印刷到宣传品
扫描二维码用手机浏览词条
保存二维码可印刷到宣传品c++预处理命令有什么用?_百度知道
c++预处理命令有什么用?
在C++的历史发展中,有很多的语言特征(特别是语言的晦涩之处)来自于C语言,预处理就是其中的一个。C++从C语言那里把C语言预处理器继承过来。预处理器的主要作用就是通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文件包含,条件编译、布局控制和宏替换4种。文件包含:#include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正文。条件编译:#if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。布局控制:#progma,这是应用预处理的一个重要方面,主要功能是为编译程序提供非常规的控制流信息。宏替换: #define,这是最常见的用法,它可以定义符号常量、函数功能、重新命名、字符串的拼接等各种功能。
其他类似问题
为您推荐:
提问者采纳
stdafx.h名称英文全称:Standard Application Framework Extensions 所谓文件预编译工程(Project)使用些MFC标准文件(Windows.H、Afxwin.H)预先编译该工程编译再编译部文件仅仅使用预编译结加快编译速度节省间 预编译文件通编译stdafx.cpp工程名命名由于预编译文件缀pch所编译结文件projectname.pch 编译器通文件stdafx.h使用预编译文件stdafx.h文件名project编译设置指定编译器认所指令#include &stdafx.h&前代码都预编译跳#include &stdafx. h&指令使用projectname.pch编译条指令所代码 所MFC实现文件第条语句都:#include
&stdafx.h&
提问者评价
其他2条回答
程序设计语言的预处理的概念:在编译之前进行的处理。 C语言的预处理主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。 预处理命令以符号“#”开头。
1.不带参数的宏定义:
  宏定义又称为宏代换、宏替换,简称“宏”。
  格式:
  #define标识符 字符串
  其中的标识符就是所谓的符号常量,也称为“宏名”。
  预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
  掌握&宏&概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
  即在对相关命令或语句的含义和功能作具体分析之前就要换:
  #define PI 3.1415926
  把程序中出现的PI全部换成3.1415926
 2.带参数的宏:...
这是头文件,包含了一些函数,输入输出函数等
意思是用到函数就必须要这个预处理命令?
预处理的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁& 鸡啄米:C++编程入门系列之二十四(C++程序设计必知:多文件结构和编译预处理命令)
鸡啄米:C++编程入门系列之二十四(C++程序设计必知:多文件结构和编译预处理命令)
&&& && 鸡啄米上一讲给大家讲了,今天给大家讲下编程入门知识--多文件结构和编译预处理命令。&&&&&& 一.C++程序的多文件结构&&&&&& 之前鸡啄米给大家看了很多比较完整的C++程序的例子,大家可能发现了,它们的结构基本上可以分为三个部分:类的声明、类的成员函数的实现和主函数。因为代码比较少,所以可以把它们写在一个文件中,但是我们实际进行软件开发时,程序会比较复杂,代码量比较大,&&&&&& 一个程序按结构至少可以划分为三个文件:类的声明文件(*.h文件)、类的实现文件(*.cpp文件)和主函数文件(使用到类的文件),如果程序更复杂,我们会为每个类单独建一个声明文件和一个实现文件。这样我们要修改某个类时就直接找到它的文件修改即可,不需要其他的文件改动。&&&&& &鸡啄米在时有个时钟类的例子,现在鸡啄米给大家看下将那个程序按照上面说的结构分到三个文件里:&&&&& &// 文件1:Clock类的声明,可以起名为Clock.h&&&&&& #include &iostream&&&&&&&&&&&&&&class Clock //时钟类声明&&&&&&&{&&&&&&&public: //外部接口&&&&&&&&&&&&&&&&&& Clock();&&&&&&&&&&&&&&&&&& void SetTime(int NewH, int NewM, int NewS);&& //三个形参均具有函数原型作用域&&&&&&&&&&&&&&&&&& void ShowTime();&&&&&&&&&&&&&&&&& ~Clock(){}&&&&&&&private: //私有数据成员&&&&&&&&&&&&&&&&&& int Hour,Minute,S&&&&&&&};&&&&& &// 文件2:Clock类的实现,可以起名为Clock.cpp&&&&&&&#include &Clock.h&&&&&&& //时钟类成员函数实现&&&&&&&Clock::Clock() //构造函数&&&&&&&{ &&&&&&&&&&&&&&&&& Hour=0;&&&&&&&&&&&&&&&&& Minute=0;&&&&&&&&&&&&&&&&& Second=0;&&&&&& }&&&&&&&void Clock::SetTime(int NewH,int NewM,int NewS)&&&&&& { &&&&&&&&&&&&&&&&& Hour=NewH;&&&&&&&&&&&&&&&&& Minute=NewM;&&&&&&&&&&&&&&&&& Second=NewS;&&&&&& }&&&&&& void Clock::ShowTime()&&&&&&&{ &&&&&&&&&&&&&&&& cout&&Hour&&&:&&&Minute&&&:&&&Second&&&&&&&& }&&&&& // 文件3:主函数,可以起名为main.cpp&&&&&& #include &Clock.h&&&&&&&&//声明全局对象g_Clock,具有文件作用域,静态生存期&&&&&& Clock g_C&&&&&& int main() //主函数&&&&&& {&&&&&&&&&&&&&&&&& cout&&&文件作用域的时钟类对象:&&& &&&&&&&&&&&&&&&&& //引用具有文件作用域的对象:&&&&&&&&&&&&&&&&& g_Clock.ShowTime();&&&&&&&&&&&&&&&&& g_Clock.SetTime(10,20,30);&&&&&&&&&&&&&&&&&& Clock myClock(g_Clock);&&& //声明具有块作用域的对象myClock,并通过默认拷贝构造函数用g_Clock初始化myClock&&&&&&&&&&&&&&&&& cout&&&块作用域的时钟类对象:&&& &&&&&&&&&&&&&&&&& myClock.ShowTime(); //引用具有块作用域的对象&&&&&&&&&&&&&&&&& return 0;&&&&&& }&&&&&& 在vs2010中如何生成这三个文件呢?我们可以点菜单中Project-&Add Class,在弹出的对话框中选择c++ class,然后由弹出个对话框,在class name处填上类名点finish就可以了,这样.h文件和.cpp文件会自动生成,我们也可以点Project-&Add New Item,在弹出的对话框中选择Header File(.h)或C++ File(.cpp)来生成.h文件或.cpp文件。&&&&&&Clock.cpp和main.cpp都使用#include &Clock.h&把类Clock的头文件Clock.h包含进来。#include指令的作用就是将#include后面的文件嵌入到当前源文件该点处,被嵌入的文件可以是.h文件也可以是.cpp文件。如果不包含Clock.h,Clock.cpp和main.cpp就不知道Clock类的声明形式,就无法使用此类,所以所有使用此类的文件都应该包含声明它的头文件。关于#include指令下面鸡啄米会讲。&&&&&& 上面的程序在编译时,由Clock.cpp和Clock.h编译生成Clock.obj,由main.cpp和Clock.h编译生成main.obj,然后就是链接过程,Clock.obj和main.obj链接生成main.exe可执行文件。如果我们只修改了类的实现文件,那么只需重新编译Clock.cpp并链接就可以,别的文件不用管,这样就提高了效率。在Windows系统中的C++程序用工程来管理多文件结构,而Unix系统一般用make工具管理,如果大家从事Unix系统软件开发,就需要自己写make文件。&&&&&& 二.编译预处理程序&&&&& &编译器在编译源程序以前,要由预处理程序对源程序文件进行预处理。预处理程序提供了一些编译预处理指令和预处理操作符。预处理指令都要由&#&开头,每个预处理指令必须单独占一行,而且不能用分号结束,可以出现在程序文件中的任何位置。&&&&&& 1.#include指令&&&&&&&#include指令也叫文件包含指令,用来将另一个源文件的内容嵌入到当前源文件该点处。其实我们一般就用此指令来包含头文件。#include指令有两种写法:&&&&&& #include &文件名&&&&&&& 使用这种写法时,会在C++安装目录的include子目录下寻找&&中标明的文件,通常叫做按标准方式搜索。&&&&&& #include &文件名&&&&&&&&使用这种写法时,会先在当前目录也就是当前工程的目录中寻找&&中标明的文件,若没有找到,则按标准方式搜索。&&&&&&&2.#define和#undef指令&&&&&& 如果你学过C语言,就会知道用#define可以定义符号常量,比如,#define PI 3.14 这条指令定义了一个符号常量PI,它的值是3.14。C++也可以这样定义符号常量,但一般更常用的是在声明时用const关键字修饰。C语言还用#define定义参数宏,来实现简单的函数运算,比如,#define add(x,y) (x+y) 这条指令说明如果我们用到add(1,2)则预处理后就会用(1+2)代替,C++中一般用内联函数来实现。&&&&&& #undef用来删除由#define定义的宏,使其不再起作用。&&&&&& 3.条件编译指令&&&&&&&用条件编译指令可以实现某些代码在满足一定条件时才会参与编译,这样我们可以利用条件编译指令将同一个程序在不同的编译条件下生成不同的目标代码。例如,我们可以在调试程序时加入一些调试语句,用条件编译指令控制只有在debug模式下这些调试语句才参与编译,而在release模式下不参与编译。&&&&&& 条件编译指令有5中形式:&&&&&&&a.第一种形式:&&&&&&&#if& 常量表达式&&&&&&&& &&&&&&&&&&&&&& &程序正文&&&&&&& //当& 常量表达式&非零时本程序段参与编译&&&&& &#endif&&&&&& b.第二种形式:&&&&& &#if&& 常量表达式&&&&&&&&&&&&&&& &程序正文1&&&&&& //当& 常量表达式&非零时本程序段参与编译&&&&&& #else&&&&&&&&&&&&&&& &程序正文2&&&&&& //当& 常量表达式&为零时本程序段参与编译&&&&&& #endif&&&&&& c.第三种形式:&&&&&&&#if 常量表达式1&&&&&&&&&&&&&&& &程序正文1&&&&&&& //当& 常量表达式1&非零时本程序段参与编译&&&&& &elif 常量表达式2&&&&&&&&&&&&&& &程序正文2&&&&&&& //当&常量表达式1&为零、& 常量表达式2&非零时本程序段参与编译&&&&& & ...&&&& & elif 常量表达式n&&&&&&&&&&&&&& &程序正文n&&&&&&& //当&常量表达式1&、...、&常量表达式n-1&均为零、& 常量表达式n&非零时本程序段参与编译&&& & &#else&&&&&&&&&&&&&&& 程序正文n+1&&&&& //其他情况下本程序段参与编译&&&&& &#endif&&&&& &d.第四种形式:&&&& & #ifdef 标识符&&&&&&&&&&&&&&& 程序段1&&&&& &#else&&&&&&&&&&&&&& &程序段2&&&&& &#endif&&&&& &如果&标识符&经#defined定义过,且未经undef删除,则编译程序段1,否则编译程序段2。&&&&&& e.第五种形式:&&&&& &#ifndef 标识符&&&&&&&&&&&&&&&&& 程序段1&&&&& &#else&&&&&&&&&&&&&&&&&&程序段2&&&&& &#endif&&&& &&如果&标识符&未被定义过,则编译程序段1,否则编译程序段2。&&&&& &4.define操作符&&&&& &define是预处理操作符,不是指令,所以不能用#开头。使用形式为:define(标识符)。如果括号里的标识符用#define定义过,并且没有用#undef删除,则define(标识符)为非0,否则为0。可以这样使用:&&&&&& &#if !define(HEAD_H)&&&&&& &#define HEAD_H&&&&&& 我们在包含头文件时,有时多次重复包含同一个头文件,比如下面这种情况:&&&&&&& // main.cpp文件&&&&&& #include &file1.h&&&&&&& #include &file2.h&&&&&&& int main()&&&&&& {&&&&&&&&&&& & &&&&&&& }&&&&&& // file1.h文件&&&&&& #include &head.h&&&&&&& &&&&&&&& // file2.h文件&&&&&& #include &head.h&&&&&&& &&&&&&&& // head.h文件&&&&&& &...&&&&&& class A&&&&&& {&&&&&&&&&&&& &...&&&&&&&}&&&& & ...&&&&&& main.cpp包含了file1.h文件,file1.h又包含了head.h文件,main.cpp还包含了file2.h文件,file2.h也包含了head.h文件,那么main.cpp就包含了两次head.h文件,在编译时就会报错,说head.h中的类A重复定义了。这时我们可以在被重复包含的文件head.h中使用条件编译指令,用一个唯一的标识符来标识head.h文件是否已经编译过,如果已经编译过则不会重复编译了。鸡啄米给大家改写下上面的head.h文件:&&&&& &// head.h文件&&&&& &#ifndef HEAD_H&&&& & #define HEAD_H&&&& & ...&&&&& &class A&&&&&& {&&&&&&&&& & ...&&&&& &}&&&&&& ...&&&&& &#endif&&&&&& 在这个改好的head.h文件中,上来会先判断HEAD_H是否被定义过,如果没有被定义过,则head.h文件还没参与过编译,就编译此文件中的源代码,同时定义HEAD_H,标记head.h文件已经参与过编译。如果HEAD_H已经被定义过,则说明此文件已经参与过编译,编译器会跳过本文件左右内容编译其他部分,类A也不会有重复定义的错误了。&&&&&&&鸡啄米今天给大家讲的内容比较多,大家慢慢看吧,其实并不难。编程入门学习中难免有问题,如果有什么问题大家可以在鸡啄米博客上留言讨论,谢谢大家。&
除非特别注明,文章均为原创
转载请标明本文地址:
作者:鸡啄米
&&( 22:16:32)&&( 21:29:34)&&( 20:24:37)&&( 20:52:10)&&( 20:41:52)&&( 22:56:59)&&( 22:11:31)&&( 20:29:27)&&( 23:16:46)&&( 22:9:51)
这个没有学过,难吗?鸡啄米 于
23:31:47 回复用心学就没什么难的
那只猫咪好萌哦!!!鸡啄米 于
23:33:17 回复呵呵,可爱吧
好高深的C+,我上学只学了tuboC鸡啄米 于
23:38:42 回复大学时候我也是学的tubur c
代码的种种,各种的头大鸡啄米 于
23:41:08 回复看看那可爱的小猫放松放松,呵呵
都是编程一看就头晕了
后面的还有吗?有点贪心了,呵呵鸡啄米 于
09:20:27 回复关于多文件结构和编译预处理命令就讲这么多了,更多C++的知识可以看看鸡啄米的这个教程的其他文章。欢迎常来交流。
我们现在正在学习C++,可我们老师总用方言讲,听的我郁闷啊,简直是折磨,来你这里学习学习鸡啄米 于
20:56:48 回复呵呵,我也有过这样的老师,欢迎常来啊
还是讲得挺详细的,非常感谢!
麻烦加我一下QQ
以前学的c,现在学c++还有点转不过来呢
对于预编译不是很理解 感觉挺难的 平时写代码也没用到预编译 难啊
您好 请问vs2010中targetver.h和stdafx.cpp这两个自动生成的文件有什么作用? 谢谢
给博主赞一个
完全随机文章C语言 预处理命令, C语言 预处理命令 #define SWAP
C语言 预处理命令 #define SWAP(a,b) t=a;a=b;=tmain(){ int a,b,t; scanf(&%d,%d&,&a,&b); SWAP(a,b); printf(&%d,%d\n&,a,b);}这是利用预处理命令实现两数交换,请问出错因为什么? NE_ChDeRaid C语言 预处理命令
改成这个就行了:#define SWAP(a,b) t=a;a=b;b=t;
#define SWAP(a,b) t=a;a=b;=t这一行不正确吧。改为:#define SWAP(a,b) t=a;a=b;b=t;
不是地址传递

我要回帖

更多关于 预处理指令 的文章

 

随机推荐