C语言预处理

预处理有很多,以下选拔作者其实用过和见过的:

 

#ifdef

处理器程序语句,我们能够用它区隔一些与特定头文件、程序库和其余文件版本有关的代码。

 1 #include <iostream>
 2 using namespace std;
 3 int main(int argc, char *argv[])
 4 {
 5 #ifdef DEBUG
 6     cout << "Beginning execution of main()" << endl;
 7 #endif
 8     return 0;
 9 }

运行结果:

1 Press any key to continue

改写代码如下:

 1 #include <iostream>
 2 using namespace std;
 3 #define DEBUG
 4 int main(int argc, char *argv[])
 5 {
 6 #ifdef DEBUG
 7 cout << "Beginning execution of main()" << endl;
 8 #endif
 9 return 0;
10 }

运营结果:

1 Beginning execution of main()
2 Press any key to continue 

 

#if的使用验证

#if的后面接的是表达式

#if (MAX==10)||(MAX==20)
 code...
#endif

它的效用是:即使(MAX==10)||(MAX==20)创制,那么编写翻译器就会把内部的#if 与
#endif之间的代码编译进去(注意:是编写翻译进去,不是推行!!)

 

 

#if defined的使用

#if后边接的是三个宏。

#if defined (x)
    ...code...
#endif

这个#if
defined它不管里面包车型地铁“x”的逻辑是“真”还是“假”它只管这么些顺序的先头的宏定义里面有没有定义“x”以此宏,假使定义了x这几个宏,那么,编译器会编写翻译中间的…code…不然不间接忽略中间的…code…代码。

另外 #if defined(x)也足以取反,也就用 #if !defined(x)

 

 

#ifdef的使用

#ifdef的行使和#if defined()的用法一致
#ifndef又和#if !defined()的用法一致。

终极强调两点:
先是:那多少个宏定义只是控制代码块是不是被编写翻译!
第二:别忘了#endif

 

#error  
#error命令是C/C++语言的预处理命令之一,当预处理器预处理到#error命令时将适可而止编写翻译并出口用户自定义的失实消息。

#define SIZE 3
int main()
{
    #if SIZE>4 && SIZE<36               
    #error     "++++++"
    #endif
}            
 //不符合条件,debug成功

 

#line处理

 1 #include "stdio.h"
 2 void Test();
 3 #line 10 "Hello.c"
 4 int main(int argc, char* argv[])
 5 {
 6 #define CONST_NAME1 "CONST_NAME1"
 7 printf("%s/n",CONST_NAME1);
 8 #undef CONST_NAME1
 9 printf("%s/n",CONST_NAME1);
10 {
11 #define CONST_NAME2 "CONST_NAME2"
12 printf("%s/n",CONST_NAME2);
13 }
14 printf("%s/n",CONST_NAME2);
15 return 0;
16 }
17 void Test()
18 {
19 printf("%s/n",CONST_NAME2);
20 }

提示如下的编写翻译音讯:
Hello.c(15) : error C2065: ‘CONST_NAME1’ : undeclared identifier
意味着近日文件的名称被认为是Hello.c, #line 10
“Hello.c”所在的下一行被认为是第⑨行,因而提醒第壹5行出错。

 

 #pragma预处理

#pragma once

貌似用来头文件初阶,预编写翻译时,只插入1回此头文件。
例如 头文件 “grandfather.h”

C语言 1C语言 2

1 #pragma once
2 #ifndef GRANDFATHER_H
3 #define GRANDFATHER_H
4 struct foo
5 {
6     int member;
7 }; 
8 #endif /* GRANDFATHER_H */

View Code

 

当那段程序数次被include (
多文本编译,相互include时会遭受),只插入和编写翻译一回。
#pragma once 的编写翻译速度 比 #ifndef GRANDFATHER_H #define
GRANDFATHER_H ..快,
据此屡屡 全用。

与#ifndef
#define的不一致可知:http://www.cppblog.com/cxiaojia/archive/2013/03/18/198526.html

 

#pragma comment

#pragma comment(…)
该指令将3个诠释记录放入三个对象文件或可执行文件中。

常用于链接二个动态库,如

#pragma comment(lib, “user32.lib”);

也有linker:将3个链接选项放入目的文件中,你能够选择那几个命令来顶替由命令行传入的要么在支付条件中安装的链接选项来强制包涵某些对象,例如:

#pragma comment(linker, “/include:_mySymbol”)

 

#pragma code_seg

 1 void func1() {                  // 默认存储在代码段.text中
 2 }
 3 
 4 #pragma code_seg(".my_data1")
 5 
 6 void func2() {                  // 存储在代码段.my_data1中
 7 }
 8 
 9 #pragma code_seg(push, r1, ".my_data2")
10 
11 void func3() {                  // 存储在代码段.my_data2中
12 }
13 
14 #pragma code_seg(pop, r1)
15 
16 void func4() {                  // 存储在代码段.my_data1中
17 }

它能够设置程序中等高校函授数代码存放的代码段,当大家开发驱动程序的时候就会利用到它。

 

 

#pragma hdrstop

#pragma hdrstop 表示预编译头文件到此结束,后边的头文件不开始展览预编写翻译。
BCB
能够预编译头文件以加速链接的进度,但只要持有头文件都开始展览预编写翻译又也许占太多磁盘空间,所以使用那么些选项排除有个别头文件。

 

#pragma warning

#pragma warning( disable : 4507 34; once :
4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不出示 4507 和 34 号警告新闻
#pragma warning(once:4385) // 4385 号警告消息仅报告3遍
#pragma warning(error:164) // 把 164 号警告消息作为一个荒唐。
与此同时那个 pragma warning 也辅助如下格式:
#pragma warning( push [ ,n ] )
#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)。

 

#pragma  resource  “*.dfm”

    表示把*.dfm文件中的财富投入工程。*.dfm中蕴涵窗体外观的定义。  

#pragma region 1   #pragma endregion**

#pragma region Region_1   // 你会发现再vc代码窗口这一行的左端多了一个小+号,用来折叠代码,
void Test() {}
void Test2() {}
void Test3() {}
#pragma endregion Region_1

使用#pragma region和#pragma
endregion关键字,来定义能够扩张和收缩的代码区域的上三保太监终极。

在VS编辑器中能够对类中的方法、注释等剧情进行隐蔽,单击右边的‘-’号即可到位隐藏,隐藏后改为‘+’,单击‘+’号能够将隐形的代码展开。