导航:首页 > 源码编译 > 预编译指令用法

预编译指令用法

发布时间:2025-04-06 17:21:29

A. 预编译的编译指令

预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。常见的预编译指令有:
(1)#include 指令
该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用 括起文件则在当前目录中寻找文件。一般来说,该文件是后缀名为h或cpp的头文件。
注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用把头文件名扩起,其意义为在先在当前目录下搜索头文件,再在系统默认目录下搜索。
(2)#define指令
该指令有三种用法:
第一种是定义标识,标识有效范围为整个程序,形如#define XXX,常与#if配合使用;
第二种是定义常数,如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1);
第三种是定义函数,如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数(这种方法存在一些弊病,见注2)。
第四种是定义宏函数,如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用时,用GEN_FUN(int),则此处预编译后就变成了 max_int(int a,int b){return a>b?a:b;},以后就可以使用max_int(x,y)就可以得到x和y中较大的数.比第三种,增加了类型的说明。
(3)#if、#else和#endif指令
这些指令一般这样配合使用:
#if defined(标识) //如果定义了标识
要执行的指令
#else
要执行的指令
#endif
在头文件中为了避免重复调用(比如说两个头文件互相包含对方),常采用这样的结构:
#if !(defined XXX) //XXX为一个在你的程序中唯一的标识符,
//每个头文件的标识符都不应相同。
//起标识符的常见方法是若头文件名为abc.h
//则标识为abc_h
#define XXX
真正的内容,如函数声明之类
#endif
注1:因为:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)。
注2:例如get_max(a++, b)时,a++会被执行多少次取决于a和b的大小!所以建议还是用内联函数而不是这种方法提高速度。虽然有这样的弊病,但这种方法的确非常灵活,因为a和b可以是各种数据类型。
注3:可以查看网络的预处理命令,编排的比较简明。

B. #ifdef #ifndef 到底怎么用

条件预编译
#if, #ifdef, #ifndef, #else, #elif, #endif通过这6条预编译指令可以简单控制编译器的行为,当文件被编译时,可以使用这些命令来控制一些特定的行被编译或不被编译。

#if expression如果表达式为真,命令后边的代码被编译。

#ifdef macro如果宏被使用#define 定义,命令后边的代码被编译。

#ifndef macro如果宏没有被使用#define 定义,命令后边的代码被编译。

A few side notes: #elif 命令是一种缩略形式,它和”elseif”具有同样的作用,你也可以在#if之后使用”defined”或者”!defined”来扩展功能。

下边是一个例子:

#ifdef DEBUG
cout << "This is the test version, i=" << i << endl;
#else
cout << "This is the proction version!" << endl;
#endif你应该注意到,这个例子和在代码中插入/删除大量的”cout”语句相比,使调试变得更容易。

C. 什么是预编译 何时需要预编译 mfc面试

预编译,顾名思义,“预”表示是在真正编译前做的工作,既然也包含“编译”二字,那与一些算法逻辑是分不开的。

对于预编译,是以符号#开头的,包含以下几部分语法:
(1)#include

该指令将xxx.xxx文件的全部内容插入此处,通常文件是后缀名为"h"或"cpp"的头文件。
若用<>括起文件则在系统的INCLUDE目录中寻找文件
若用" "括起文件则在当前目录中寻找文件。
(2)#define
该指令有以下几种用法:
第一种是定义标识,标识有效范围为整个程序,形如#define XXX,常与#if配合使用;
第二种是定义常数,如#define max 100,则max代表100。
第三种是定义"函数",如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数。
第四种是定义"宏函数",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用时,用GEN_FUN(int),则此处预编译后就变成了 max_int(int a,int b){return a>b?a:b;},以后就可以使用max_int(x,y)就可以得到x和y中较大的数.比第三种,增加了类型的说明。
(3)#if、#else和#endif指令
这些指令一般这样配合使用:
#if defined(标识) //如果定义了标识
要执行的指令
#else
要执行的指令
#endif
在头文件中为了避免重复调用(比如说两个头文件互相包含对方),常采用这样的结构:
#if !(defined XXX) //XXX为一个在你的程序中唯一的标识符,
//每个头文件的标识符都不应相同。
//起标识符的常见方法是若头文件名为"abc.h"
//则标识为"abc_h"
#define XXX
真正的内容,如函数声明之类
#endif

D. c++ 头文件中加入 #ifnodef #define #engif 有什么用

你说的是C语言中的宏定义,也是预编译指令
首先,你对宏定义的书写有误,#ifnodef应该是#ifndef,#engif应该是#endif
接下来我们说说这几个宏定义的用法
#define:这个宏定义就是使用一个命名来替代另一个。比如#define age 5
那么,在程序中,填入age,在预编译的时候,编译器就会自动将age替换成5,注意,这个是直接替换,所以如果#define X 3+1,那么在程序中输入5*X,编译器就会将其替换成5*3+1,这种情况一般会这样定义#define X (3+1)
#ifdef、#ifndef、#endif:一般#ifdef/#ifndef和#endif是成对出现的。
#ifdef顾名思义,就是如果定义了某个宏。比如
#ifdef age //如果之前有#define age value(这个是age对应的值),就执行下面的语句
//do something
#endif //执行语句到这里结束
#ifndef与#ifdef正相反,直译是if not define,就是如果没有定义某个宏,就执行if内的语句。如:
#ifndef age //如果之前没有#define age value(这个是age对应的值),就执行下面的语句
//do something
#endif //执行语句到这里结束

E. include的用法

include是预编译指令,include<reg52.h>的作用就是将52单片机的头文件reg52.h嵌入源文件中。

预处理器发现 #include 指令后,就会寻找指令后面<>中的文件名,并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include 指令, 就像把被包含文件中的全部内容键入到源文件中的这个位置一样。

<reg52.h>表示调用了52或者51单片机的资源,也就是可以直接对单片机的相关寄存器与引脚进行操作,十分方便。

(5)预编译指令用法扩展阅读:

reg52.h中特殊字节寄存器说明:

sfr P0 = 0x80; // P0口特殊寄存器寻址位 

sfr P1 = 0x90; // P1口特殊寄存器寻址位 

sfr P2 = 0xA0; // P2口特殊寄存器寻址位 

sfr P3 = 0xB0; // P3口特殊寄存器寻址位 

sfr PSW = 0xD0; //程序状态字寄存器 

sfr  ACC = 0xE0; //累加器 

sfr B = 0xF0; //B 特殊寄存器 

sfr SP = 0x81; //堆栈指针寄存器 

sfr DPL = 0x82; //数字指针(低位) 

sfr DPH = 0x83; //数字指针(高位) 

sfr PCON = 0x87; //电源控制寄存器 

sfr TCON =  0x88; //定时器/计数器0和1控制 

sfr TMOD = 0x89; //定时器/计数器0和1模式 

sfr TL0 = 0x8A; //定时器/计数器0低8位寄存器  

sfr TL1 = 0x8B; //定时器/计数器1低8位寄存器   

sfr TH0 = 0x8C;  //定时器/计数器0高8位寄存器   

sfr TH1 = 0x8D; //定时器/计数器1高8位寄存器 

sfr IE = 0xA8; //中断允许寄存器 

sfr IP = 0xB8; //中断优先寄存器(低) 

sfr SCON = 0x98; //串口控制寄存器 

sfr SBUF = 0x9 9; //串口数据缓冲器

阅读全文

与预编译指令用法相关的资料

热点内容
lombok程序员 浏览:912
md的命令 浏览:449
发型p图素材哪个app可以 浏览:791
弹性云服务器价格表 浏览:387
有关三生三世番外的小说在哪个app 浏览:374
cmd打开服务器地址 浏览:387
思域压缩机型号 浏览:859
文件加密转移 浏览:184
3d中的ffd命令点不上 浏览:904
球面怎么编程序 浏览:798
怎么给电脑安装服务器系统 浏览:124
ndklinux环境配置 浏览:947
php图片压缩网站源码 浏览:4
安卓虚拟机停止是什么问题 浏览:974
真空压缩袋破了 浏览:603
学做甜品的app哪个好 浏览:273
服务器上网卡为什么有4个接口 浏览:599
小鸡答题是哪个app 浏览:67
淘宝坑位产出算法 浏览:231
fleury算法中的桥怎么判断 浏览:322