《C++ 预编译》

C++的预编译(预处理),是指在C++程序源代码被编译之前,由预处理器对C++程序源代码进行的处理。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的符号用来支持宏调用。

程序的编译过程可以分为预处理、编译、汇编三部分,其中预处理是首先执行的过程,预处理过程扫描程序源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程读入源代码之后,会检查代码里包含的预处理指令,完成诸如包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码的工作。

总之,预编译程序的作用就是根据源代码中的预编译指令修改源代码。而预编译程序是由一系列和预编译相关的的命令符组成的。预编译指令以“#”作为起始标志,其后紧跟预编译指令关键字,之后是空格,空格之后是预编译指令的内容。

 

定义变量和取消定义变量


预编译程序是通过define和undef指令实现定义变量和取消定义变量的。undef的作用是取消该指令前面的的程序使用define定义的宏变量。

简单示例

#include "iostream"

using namespace std;

int main()
{
#define A 20
	cout<<"A:"<<A<<endl;
#undef A
#define A 50
	cout<<"A:"<<A<<endl;
	system("pause");
	return 0;
}

输出结果

A:20
A:50
请按任意键继续. . .

 

条件预编译指令


一般情况下,程序的每一行源代码都是要编译的。特殊情况下,只有满足一定条件的程序才需要编译,这就是条件编译。常用的条件编译关键字主要有#if、#ifdef、#ifndef、#else、#elif和#endif,这几个关键字的组合一般三种形式。

(1)第一种形式

这种组合形式的功能是当表达式的值为“真”(非零)时,编译程序段1;否则,编译程序段2。

#if 表达式
    程序段1
#else
    程序段2
#endif

(2)第二种形式

#ifdef 标识符
    程序段1
#else
    程序段2
#endif

(3)第三种形式

#ifndef 标识符
    程序段1
#else
    程序段2
#endif

简单示例

#include <iostream>
using namespace std;

#define ABCD 2

int main ()
{
//1
#ifdef ABCD 
	cout<< "1:yes\n" ;
#else 
	cout<< "1:no\n" ; 
#endif 

//2
#ifndef ABCD 
		cout<<"2:no\n "; 
#elif ABCD == 2 
		cout<<"2:yes\n"; 
#else 
		cout<<"2:no2\n" ; 
#endif 

//3
#if !defined(DCBA)&&(ABCD<2*4-3)
		cout<<"3:yes\n"; 
#endif 
	system("pause");
	return 0;
}

输出结果

1:yes
2:yes
3:yes
请按任意键继续. . .

 

包含头文件指令


关键字include是最常见的预编译指令之一。其功能是将被包含的文件中的源代码放进源文件中,从而实现代码重用。

常见的形式为:

#include “文件名.h”

例如:

#include “stdio.h”
#include <iostream>

 

#line预编译指令


 #line预编译指令的作用是修改代码行的行号以及编译源文件的名字。

 

特殊预编译指令


1、#error指令

#error指令可以强制停止编译程序,并给出提示信息。

2、#pragma指令

#pragma指令的参数有很多种形式,每种形式都代表了一种不同的功能,#pragma指令的参数的形式如下:

  • message
  • argsused
  • exit/startup
  • inline
  • once
  • warning
  • code_seg和data_seg
  • resource
  • saveregs
  • hdrstop/hdrfile

(1) #pragma message

#pragma message指令使用于提示一些有用的信息,程序编译的过程中,在编译信息窗口输出这些信息。

简单示例

(2)#pragma argsused

#pragma argsused指令仅允许出现在函数定义之间,且仅影响下一个函数,使警告信息被禁止或者无效。

(3)#pragma exit/startup

pragma startup指令可以实现设置程序启动之前需要执行的函数;pragma exit指令可以实现设置程序退出之前需要执行的函数。

简单示例

(4)#pragma once

#pragma once指令可以实现仅编译一次该头文件。一般#pragma once放在头文件的最开始。

(5)#pragma warning

#pragma warning可以实现设定提示信息的现实与否以及如何显示。例如:

#pragma warning (disable:4507 34)
功能:不显示4507和34号警告信息

#pragma warning (once:4385)
功能:仅显示一次4385号信息

#pragma warning (error:164)
功能:将164号警告信息作为一个错误信息显示

#pragma warning (push)
功能:保存所有警告信息的现有警告状态

#pragma warning (pop)
功能:从栈中弹出最后一个警告信息

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值