常用C/C++预处理指令详解


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

  常用的预处理指令包括:

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

宏定义

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

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

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

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

复制代码 代码如下:

#include<iostream>
using namespace std;

#define STR(n)"abcd"#n

int 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中使用较多。



相关阅读:
Android设置PreferenceCategory背景颜色的方法
ASP.NET配置文件Web.config用法详解
jquery实现最简单的滑动菜单效果代码
深入理解Java的接口与抽象类
分享几个Android开发有用的程序代码
php中的strpos使用示例
浅析SQLServer中的Scanf与Printf
详解PHP的Yii框架中日志的相关配置及使用
MySQL数据库远程访问权限如何打开(两种方法)
Android利用ViewPager实现滑动广告板实例源码
浅谈如何实现easyui的datebox格式化
NodeJS中Buffer模块详解
jQuery+HTML5实现图片上传前预览效果
jQuery实现页面内锚点平滑跳转特效的方法总结
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 别脱我裤子,我已经结婚了! 我要起个新名字 三字经读后感,我对三字经的心得体会 拾荒的老妪 好友赠言-佳节祝福版 关于《社会保障基金现场监督规则》的通知 李湘的名言 小学一年级作文800字:成长里的故事 水浒传读后感400字精选 酒店总机实践报告2013 我想找回心中那只断了线的风筝 表示自强句子 2015县完善四大机制,着力构建动物防疫工作新体制 你的人生有多奢侈 暑假社会实践报告范文二 人教版七年级上册一单元作文:这就是我(15)作文300字 最新银行员工入党申请书模板 有钱也不好使,创业靠脑子 记(你不会找到路,除非你敢于迷路) Hes just not that into you 2015工作自我评价范文 做一片美的叶子 你的梦想是什么?作文200字 小学优秀教师推荐材料 一颗心的坚持 [图文]桔子 2月预备党员思想汇报范文:紧随当的步伐 冰雪公主(三十九)作文800字 北京的鸟巢作文450字 桂花村的秋天 小学六年级作文600字:阅读亲情 凝望,满眸情长 钱币酒精=你的少女时代? 没熬过几个低潮期怎么好意思谈人生? 秋风又起作文900字 警惕过于甜腻的散文 某市市司法局局长的任职前发言 小兔和大象作文200字 人教版九年级上册一单元作文:雨的诉说(3)作文600字 屋顶那一缕阳光 企业集体合同书模板 我放开了手,但你,却回了头 后羿射日读后感400字 小学二年级作文1200字:向往一次旅行 2012村委书记年度述职报告 我想过一个“洗脑节” 住宾馆 选聘生半年工作总结 熟悉的铃声 心中有爱,天涯咫尺

Copyright © 2016 phpStudy |