预处理

预处理有很多,以下选取我实际用过和见过的:

#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"所在的下一行被认为是第10行,因此提示第15行出错。

 #pragma预处理

#pragma once

一般用于头文件开始,预编译时,只插入一次此头文件。 例如 头文件 "grandfather.h"

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

当这段程序多次被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(...) 该指令将一个注释记录放入一个对象文件或可执行文件中。

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

#pragma comment(lib, "user32.lib");

也有linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项来强制包含某个对象,例如:

#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 号警告信息仅报告一次 #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编辑器中可以对类中的方法、注释等内容进行隐藏,单击左侧的‘-’号即可完成隐藏,隐藏后变为‘+’,单击‘+’号可以将隐藏的代码展开。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习自然语言处理

实例快速上手shell脚本

昨天老师给了宗林师兄任务,让我跑一个机器翻译的程序。我看了看就是跑shell脚本。刚开始一看。。我的天。。好长的代码,但是觉得这个时候就更不能怕,得迎难而上,趁...

3429
来自专栏WebDeveloper

跟我学习php文件和目录常用函数-下篇

1> bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false ...

671
来自专栏Java帮帮-微信公众号-技术文章全总结

10.Java文件操作案例

10.Java文件操作案例 Java 实例 - 文件写入 以下实例演示了使用 write() 方法向文件写入内容: 实例 ? 以上代码运行输出结果为: ? 创建...

2916
来自专栏散尽浮华

分布式监控系统Zabbix-3.0.3-完整安装记录(4)-解决zabbix监控图中出现中文乱码问题

之前部署了Zabbix-3.0.3监控系统,在安装数据库时已经将zabbix库设置了utf-8字符。 首先确定zabbix开启了中文支持功能: 登录到zabbi...

1816
来自专栏林德熙的博客

Roslyn 在项目文件使用条件判断 判断不相等判断大小判断文件存在判断多个条件使用的范围

本文是 手把手教你写 Roslyn 修改编译 的文章,在阅读本文之前,希望已经知道了大多数关于 msbuild 的知识

471
来自专栏linux驱动个人学习

VFS四大对象之四-struct file

继上一篇文章: http://yehe.isd.com/column/support-plan/article-edit/93709 四、file结构体 文件对...

3496
来自专栏青枫的专栏

Java主函数解释、java/javac命令解释、classpath解释

任何一段程序必须要有一个执行的起始点,有一个入口,这个入口就是主函数,本质上这个主函数就被虚拟机所调用。 即:主函数是一个入口、它被虚拟机所调用、有了主函数就能...

671
来自专栏Python

logging模块

logging模块 函数式简单配置 import logging logging.debug('debug message') logging.info...

1897
来自专栏开源优测

[接口测试 - 基础篇] 10 别啊,还有INI格式呢,别忘记我

什么是INI格式 INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows操作系统中。这种配置...

35012
来自专栏Java学习123

linux mount -t用法

3025

扫码关注云+社区