预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。预处理命令以符号“#”开头。

  常用的预处理指令包括:

宏定义:#define
文件包含:#include
条件编译:#if、#elif、#ifndef、#ifdef、#endif、#undef
错误信息指令:#error
#line指令
布局控制:#pragma

宏定义

  宏定义又称为宏代换、宏替换,简称“宏”。宏替换只作替换,不做计算,不做表达式求解。宏定义分带参数的宏定义和不带参数的宏定义。在带参数的宏定义,宏名和参数的括号间不能有空格。

  宏定义不分配内存,变量定义分配内存。

  宏展开不占运行时间,只占编译时间;函数调用占运行时间(分配内存、保留现场、值传递、返回值)。

  出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串,有时把这种用法的#称为字符串化运算符。例如:

#include<iostream>
using namespace std;#define STR(n)"abcd"#nint main()
{cout<<STR(6)<<endl;system("pause");return 0;
}

输出结果为:

  ##运算符用于把参数连接到一起,预处理程序把出现在##两侧的参数合并成一个符号。例如:

#include<iostream>
using namespace std;
#define STR(a,b,c) a##b##c
int main()
{cout<<STR(1,2,3)<<endl;system("pause");return 0;
}

输出结果为:

文件包含

  #include<文件名>称为标准方式,到系统头文件目录查找文件,#include"文件名"则先在当前目录(用户路径)查找,而后到系统头文件目录查找。

  我们以#include<iostream.h>和#include<iostream>为例说 明:iostream.h是C语言格式的头(库)文件,为旧版本的标准库,只支持窄字符集;而iostream为C++的标准头文件,支持窄字符集和宽字 符集。

  被包含文件中的静态全局变量不用在包含文件中声明。

条件编译

  使用条件编译可以使目标程序变小,运行时间变短。

  #undef指令,用来删除事先定义的宏定义,其一般形式为:#undef宏替换名

错误信息指令

  #error指令,该指令用于程序的调试,输出一个错误信息,当编译中遇到#error指令就停止编译。其一般形式为:#error出错信息。

#ifndef __cplusplus
#error this is not a C++ complier.
#endif
#include<iostream>
using namespace std;
int main()
{system("pause");return 0;
}

#line指令

  命令#line改变_LINE_与_FILE_的内容,它们是在编译程序中预先定义的标识符。

  其格式为:#line number [ filename ],这条指令可以改变当前的行号和文件名。

#include<iostream>
using namespace std;#line 100 "a.cpp"int main()
{cout<<__LINE__<<'\t'<<__FILE__<<endl;system("pause");return 0;
}

运行结果:

布局控制指令

  在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和 C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

  其格式一般为: #pragma Para,其中Para 为参数。

message 参数:在编译信息输出窗口中输出相应的信息

#pragma message("消息文本")

code_seg参数:设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它

#pragma code_seg(["section-name"[,"section-class"]])

#pragma once:

  只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,但移植性差。如果写的程序要跨平台,最好使用C++中的宏定义。

#pragma hdrstop:表示预编译头文件到此为止,后面的头文件不进行预编译。

#pragma resource:

#pragma resource "winform.dfm"

表示把winform.dfm文件中的资源加入工程,winform.dfm中包括窗体外观的定义。

#pragma warning:输出警告信息。

我们运行一下程序:

int main()
{float f=3.6;int i=f;cout<<i<<endl;system("pause");return 0;
}

会出现如下警告信息:1>ClCompile:1>f.cpp1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning C4305: “初始化”: 从“double”到“float”截断1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 从“float”转换到“int”,可能丢失数据

若我们在程序上方添加:

#pragma warning(disable:4305)

则编译时警告信息会变为:


1>ClCompile:
1>f.cpp
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning C4305: “初始化”: 从“double”到“float”截断
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 从“float”转换到“int”,可能丢失数据

若我们在程序上方添加:

#pragma warning(error:4244)

则警告信息会变为错误信息:

1>ClCompile:
1>f.cpp
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 从“float”转换到“int”,可能丢失数据

#pragma comment:该指令将一个注释记录放入一个对象文件或可执行文件中。

  常用的lib关键字,可以帮我们连入一个库文件。例如:

#pragma comment(lib,"wsock32.lib")

#pragma disable:在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。一般在C51中使用较多。

转载于:https://www.cnblogs.com/alanfeng/p/5025413.html

常用C/C++预处理指令详解相关推荐

  1. pragma comment的使用 pragma预处理指令详解

    pragma comment的使用 pragma预处理指令详解 #pragma comment( comment-type [,"commentstring"] ) 该宏放置一个注 ...

  2. #pragma comment和#pragma 预处理指令详解

    该宏放置一个注释到对象文件或者可执行文件. 例如,#pragma   comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库. 和在工程设置里写上链入 ...

  3. #pragma预处理指令详解

    #pragma预处理指令详解 在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保 ...

  4. C#中的预处理指令详解

    这篇文章主要介绍了C#中的预处理指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregion ...

  5. C语言中编译预处理命令作用,C语言预处理命令详解

    原标题:C语言预处理命令详解 关注百问科技并将它设为星标 不错过任何一篇嵌入式干货 ------ 作者:clover_toeic 原文出处: https://www.cnblogs.com/clove ...

  6. arm-linux-ld中的参数,arm-linux-ld指令详解

    arm-linux-ld指令详解 我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来:其次,这些.o文件存在相互调用的关系 ...

  7. Dockerfile 指令详解1

    Dockerfile 指令详解 我们已经介绍了 FROM,RUN,还提及了 COPY, ADD,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COPY 复制 ...

  8. Linux中的ps指令详解

    [时间]2018.12.16 [题目]Linux中的ps指令详解 转载地址:https://www.cnblogs.com/exe19/p/5511733.html 概述 要对进程进行监测和控制,首先 ...

  9. Angular ng-model指令详解

    Angular ng-model指令详解 声明 将输入域的值与 AngularJS 创建的变量绑定 双向数据绑定 表单验证 自定义类样式 常用应用状态 声明 本文根据菜鸟教程整理 http://www ...

最新文章

  1. 云计算之KVM虚拟化实战
  2. jmeter连数据库
  3. 分享几个大数据相关岗位的职责和面试问题
  4. 网站运营需要注意什么?
  5. CVE-2020-1472 | Netlogon 特权提升漏洞预警
  6. 前端基础:JavaScript 代码风格指南
  7. 爬取100页京东商品评论
  8. android程序root权限,android应用程序中应用root权限
  9. Xamarin开发Android---提示、跳转、传递数值 (学习总结)
  10. 使用数组初始化vector对象
  11. html 手机端可以选择复制粘贴,js移动端实现网站内容复制粘贴功能
  12. Packet Tracer安装包及安装教程(8.0版本)
  13. 高性价比蓝牙耳机推荐,五款便宜又好用的真无线蓝牙耳机
  14. html文档注释多行,css注释的写法(单行和多行)
  15. wi7计算机如何查看隐藏的文件夹,win7隐藏的文件夹怎么显示?隐藏文件夹查看及设置方法...
  16. 设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。要求如下:
  17. GATT协议学习笔记
  18. 如何使用pyinstaller将Python的代码打包
  19. java循环屏障,Java并发编程系列23|循环屏障CyclicBarrier
  20. 怎么退出自适应巡航_定速巡航和自适应定速巡航的区别

热门文章

  1. MySQL 批量修改数据库的字符集和排序规则
  2. Windows下VSCode运行shell
  3. idea 报 Cannot access alimaven
  4. 2021年下半年 全国计算机技术与软件专业技术资格考试 浙江省合格人员数据分布
  5. 【HDOJ 2020.09.29】一些语法水题ByVJ
  6. 牛客竞赛,GDDU第十届文远知行杯新生程序设计竞赛,摸鱼记(BDEIKL题解,补G,ACFHJ)
  7. 【SHOI2002】【Luogu1434】滑雪(记忆化)
  8. 文档服务器archive,文档查询服务器,archive server,音标,读音,翻译,英文例句,英语词典...
  9. linux make 无法生成 .o gch,Linux--makefile的使用
  10. php7版本搭建sqli labs,CentOS 7 LAMP搭建并且部署sqli-labs