- 浏览: 2046444 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
C++预处理指令
#include
#define
#undef
#pragma
#import
#error
#line
#ifdef
#ifndef
#if
#else
#elif
#endif
宏以#起始 不以;结束
一. #include 文件包含
预编译期发现#include后,将会寻找HeaderName并把其包含到当前文件中
EG:#include <HeaderName>
常见形式:
#include <iostream.h> //
#include <iostream> //
#include "iostream" //
#include "TestHeader.h" //
#include "..\TestHeader.h" //
1. #include <iostream.h>和#include <iostream>区别
#include <iostream.h>是老规范,现已经抛弃
#include <iostream>是新规范,使用名称空间避免名称冲突。即将所有的定义放在了一个名称空间std中
2. #include <iostream>和#include "iostream"区别
#include <iostream>直接在系统的路径下查找此头文件。多是系统的头文件
#include "iostream"首先在当前目录查找,如果没有找到再到系统目录查找
3. 头文件的多次包含问题
编译器对每个文件只编译一次生成一份机器代码.obj,如果在多个地方包含了同一个头文件,则会出现多次包含的错误,即试图让编译器将此文件编译多次生成多份机器代码。
预编译保护解决此问题。
二. #define #undef 宏替换
#define 宏 宏主体
宏展开:在代码中出现宏,会用宏实体代替宏
#define 定义常量、函数宏
#undef 结束常量、函数宏定义
1. 常量宏
常量宏:是最常见的一种形式。即使用一个宏代替实际的常量,如数据、字符、字符串常量等
#define CONST_VAL 2
#define MEG_EG "Test Macro!"
#define CHARACTOR_EG 'M'
注:
(1) 可以使用#undef结束常量宏定义,结束宏定义宏此宏不能再次使用。即时这个宏实际不存在,使用#undef结束宏定义也不是错误,相反在定义一个宏时如果不确定其是否已经定义可以先使用#undef结束其定义,然后重新定义
(2) 可以多次定义同一个宏
2. 函数宏
函数宏:外形和作用都与函数类似并且有参数输入
#define MAX(x, y) ( (x>y)?x:y )
注:
(1) 定义函数宏是将宏体都用一个“( ) “括起来。
#define MAX(x, y) ( (x>y)?x:y )
cout << "MAX = " << MAX(1,2) << endl; //正确
#define MAX(x, y) (x>y)?x:y
cout << "MAX = " << MAX(1,2) << endl; //错误。将<<和宏混淆
(2) 通常将函数宏第一为一行,但可以使用“\“定义多行宏函数
#define MAX(x, y) ( (x>y)?\
x:y )
(3) 可以使用#undef结束函数宏定义
#undef MAX(x, y)和#undef MAX都可以
(4) 宏函数产生内联代码,形式上等同与inline函数,当没有inline函数安全
(5) 宏函数不检查输入的参数(相比inline函数不安全)
(6) 宏函数没有inline函数效率高
3. #运算符
#运算符可以在一个字符串中输入宏参数,使得一个字符串可以包含某个参数
EG:
#define STR_A(A) ( printf("STR_A(A) A = "#A" ") )
#define STR_B(B) ( "STR_B(B) B = "#B" " )
#define STR_C(CA, CB) ( "STR_C(CA, CB) C = "#CA" "#CB" " )
STR_A(1);
cout << endl;
cout << STR_B(2) << endl;
cout << STR_B(B) << endl;
cout << STR_C(CA, CB) << endl;
string strB = "strB ";
strB += " + ";
strB += STR_B(B);
cout << "strB + Macro STR_B = " << strB << endl;
4. ##运算符
##运算符用于创建变化的变量,即使用宏参数创建变化的变量
EG:
#define VARIAVLE_NAME(N) ( n##N )
int VARIAVLE_NAME(IntA) = 1; // int nIntA
int VARIAVLE_NAME(1) = 1; // int n1
int VARIAVLE_NAME(2) = 1; // int n2
cout << "nIntA = " << nIntA << endl;
cout << "n" << 1 <<" = " << VARIAVLE_NAME(1) << endl;
cout << "n" << 2 <<" = " << VARIAVLE_NAME(2) << endl;
double VARIAVLE_NAME(DoubleA) = 1.1;
cout << "nDoubleA = " << nDoubleA << endl;
三. #pragma
其格式一般为: #pragma para
其中para 为参数,下面来看一些常用的参数。
(1) #pragma once
多次包含的保护。只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
等价于:(此为C/C++标准 通用性更强)
#ifndef HEADER_NAME_HPP
#define HEADER_NAME_HPP
Your Code
#endif //END HEADER_NAME_HPP
(2) #pragma warning()
#pragma warning( warning-specifier : warning-number-list
[; warning-specifier : warning-number-list...] )
#pragma warning( push[ ,n ] )
#pragma warning( pop )
EG:
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示和号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error: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 )
在这段代码的最后,重新保存所有的警告信息(包括,和)。
(3) #pragma warning()
#pragma warning( warning-specifier : warning-number-list
[; warning-specifier : warning-number-list...] )
#pragma warning( push[ ,n ] )
#pragma warning( pop )
EG:
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示和号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error: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 )
在这段代码的最后,重新保存所有的警告信息(包括,和)。
四. #import
常用于导入.dll
五. #error
该指令用于程序的调试, 当编译中遇到#error指令就停止编译。
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
如果没有在__cplusplus环境下,就会输出This software requires the cplusplus OS.然后诱发编译器终止。所以总的来说,这条指令的目的就是在程序崩溃之前能够给出一定的信息。
六. #line
用于重置__FILE__和__LINE__
初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C++源码编译过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ianleelj/archive/2009/02/26/3939607.aspx
#include
#define
#undef
#pragma
#import
#error
#line
#ifdef
#ifndef
#if
#else
#elif
#endif
宏以#起始 不以;结束
一. #include 文件包含
预编译期发现#include后,将会寻找HeaderName并把其包含到当前文件中
EG:#include <HeaderName>
常见形式:
#include <iostream.h> //
#include <iostream> //
#include "iostream" //
#include "TestHeader.h" //
#include "..\TestHeader.h" //
1. #include <iostream.h>和#include <iostream>区别
#include <iostream.h>是老规范,现已经抛弃
#include <iostream>是新规范,使用名称空间避免名称冲突。即将所有的定义放在了一个名称空间std中
2. #include <iostream>和#include "iostream"区别
#include <iostream>直接在系统的路径下查找此头文件。多是系统的头文件
#include "iostream"首先在当前目录查找,如果没有找到再到系统目录查找
3. 头文件的多次包含问题
编译器对每个文件只编译一次生成一份机器代码.obj,如果在多个地方包含了同一个头文件,则会出现多次包含的错误,即试图让编译器将此文件编译多次生成多份机器代码。
预编译保护解决此问题。
二. #define #undef 宏替换
#define 宏 宏主体
宏展开:在代码中出现宏,会用宏实体代替宏
#define 定义常量、函数宏
#undef 结束常量、函数宏定义
1. 常量宏
常量宏:是最常见的一种形式。即使用一个宏代替实际的常量,如数据、字符、字符串常量等
#define CONST_VAL 2
#define MEG_EG "Test Macro!"
#define CHARACTOR_EG 'M'
注:
(1) 可以使用#undef结束常量宏定义,结束宏定义宏此宏不能再次使用。即时这个宏实际不存在,使用#undef结束宏定义也不是错误,相反在定义一个宏时如果不确定其是否已经定义可以先使用#undef结束其定义,然后重新定义
(2) 可以多次定义同一个宏
2. 函数宏
函数宏:外形和作用都与函数类似并且有参数输入
#define MAX(x, y) ( (x>y)?x:y )
注:
(1) 定义函数宏是将宏体都用一个“( ) “括起来。
#define MAX(x, y) ( (x>y)?x:y )
cout << "MAX = " << MAX(1,2) << endl; //正确
#define MAX(x, y) (x>y)?x:y
cout << "MAX = " << MAX(1,2) << endl; //错误。将<<和宏混淆
(2) 通常将函数宏第一为一行,但可以使用“\“定义多行宏函数
#define MAX(x, y) ( (x>y)?\
x:y )
(3) 可以使用#undef结束函数宏定义
#undef MAX(x, y)和#undef MAX都可以
(4) 宏函数产生内联代码,形式上等同与inline函数,当没有inline函数安全
(5) 宏函数不检查输入的参数(相比inline函数不安全)
(6) 宏函数没有inline函数效率高
3. #运算符
#运算符可以在一个字符串中输入宏参数,使得一个字符串可以包含某个参数
EG:
#define STR_A(A) ( printf("STR_A(A) A = "#A" ") )
#define STR_B(B) ( "STR_B(B) B = "#B" " )
#define STR_C(CA, CB) ( "STR_C(CA, CB) C = "#CA" "#CB" " )
STR_A(1);
cout << endl;
cout << STR_B(2) << endl;
cout << STR_B(B) << endl;
cout << STR_C(CA, CB) << endl;
string strB = "strB ";
strB += " + ";
strB += STR_B(B);
cout << "strB + Macro STR_B = " << strB << endl;
4. ##运算符
##运算符用于创建变化的变量,即使用宏参数创建变化的变量
EG:
#define VARIAVLE_NAME(N) ( n##N )
int VARIAVLE_NAME(IntA) = 1; // int nIntA
int VARIAVLE_NAME(1) = 1; // int n1
int VARIAVLE_NAME(2) = 1; // int n2
cout << "nIntA = " << nIntA << endl;
cout << "n" << 1 <<" = " << VARIAVLE_NAME(1) << endl;
cout << "n" << 2 <<" = " << VARIAVLE_NAME(2) << endl;
double VARIAVLE_NAME(DoubleA) = 1.1;
cout << "nDoubleA = " << nDoubleA << endl;
三. #pragma
其格式一般为: #pragma para
其中para 为参数,下面来看一些常用的参数。
(1) #pragma once
多次包含的保护。只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
等价于:(此为C/C++标准 通用性更强)
#ifndef HEADER_NAME_HPP
#define HEADER_NAME_HPP
Your Code
#endif //END HEADER_NAME_HPP
(2) #pragma warning()
#pragma warning( warning-specifier : warning-number-list
[; warning-specifier : warning-number-list...] )
#pragma warning( push[ ,n ] )
#pragma warning( pop )
EG:
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示和号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error: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 )
在这段代码的最后,重新保存所有的警告信息(包括,和)。
(3) #pragma warning()
#pragma warning( warning-specifier : warning-number-list
[; warning-specifier : warning-number-list...] )
#pragma warning( push[ ,n ] )
#pragma warning( pop )
EG:
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示和号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error: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 )
在这段代码的最后,重新保存所有的警告信息(包括,和)。
四. #import
常用于导入.dll
五. #error
该指令用于程序的调试, 当编译中遇到#error指令就停止编译。
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
如果没有在__cplusplus环境下,就会输出This software requires the cplusplus OS.然后诱发编译器终止。所以总的来说,这条指令的目的就是在程序崩溃之前能够给出一定的信息。
六. #line
用于重置__FILE__和__LINE__
初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C++源码编译过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ianleelj/archive/2009/02/26/3939607.aspx
发表评论
-
DLL中导出函数的声明有两种方式:
2012-11-12 16:42 1863DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中 ... -
k-means算法的C++实现
2011-04-05 11:38 2343k-means算法的C++实现: http://www.ku ... -
main()中的参数
2010-10-31 10:41 1540所有的应用程序都是从以main函数作为入口, 而mai ... -
static作用
2010-10-26 19:15 2390转自(from http://www.cnb ... -
mmap函数
2010-10-25 22:41 1915mmap函数的使用方法 UNIX ... -
C语言中三种内存分配方式
2010-10-25 20:23 01.malloc 原型:extern void *ma ... -
位拷贝和值拷贝
2010-10-23 15:37 1601为了便于说明我们以String类为例: 首先定义String ... -
(转帖)把类的析构函数写成虚函数的用意
2010-10-23 15:10 1702#include <iostream.h> cl ... -
动态规划/贪心算法----0/1背包问题AND普通背包问题
2010-10-23 14:03 6829两个背包问题都是比较典型的问题,对这两种算法的理解有很好的帮助 ... -
netstat, nslookup, finger, ping命令
2010-10-22 17:13 1535Netstat用于显示与IP、TCP ... -
C++返回值
2010-10-22 16:53 1551C++函数返回值: (1)正常情况下,函数的参数要复制一份在 ... -
switch语句后的表达式的值
2010-10-22 16:23 1844一般格式: switch (表达式) { case 常量 ... -
C++四种强制类型转换
2010-10-19 11:45 1579显式类型转换又被称之 ... -
C++四种强制类型转化的区别
2010-10-19 11:43 1359先介绍const_cast和reinterpret_cast: ... -
Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
2010-10-18 14:24 1835使线程同步 在程序中使用多线程时,一般很少有多个线程能在其 ... -
(转)临界区,互斥量,信号量,事件的区别
2010-10-18 14:22 1774四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行 ... -
(转)在C++中实现同步锁,类似synchronize(object){....}
2010-10-18 13:49 1886在做C++的项目中发现, ... -
C++线程同步
2010-10-18 13:46 1619线程同步是多 ... -
C++多线程编程
2010-10-18 10:56 1755今天我给大家讲一讲C++ ... -
关于C++对函数传参与函数返回值进行引用传递的详解
2010-10-16 22:51 4063关于C++对函数传参与函数返回值进行引用传递的详解 ...
相关推荐
C++预编译指令是编程过程中非常重要的工具,它们允许程序员根据特定的条件来控制代码的编译过程。本文将详细介绍四个主要的预编译指令:`#undef`、`#ifdef`、`#ifndef` 和 `#if`,以及它们在实际编程中的应用。 ...
message参数是#pragma指令中最常用的参数之一,它可以在编译信息输出窗口中输出相应的信息。例如: `#pragma message("消息文本")` 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。这可以用来检查...
C++中的预处理器(Preprocessor)主要负责处理源代码中的预编译指令,如`#include`、`#define`、`#ifdef`等。`#include`指令用于将其他头文件的内容插入到当前源文件中,这样可以复用代码并维护头文件的公共定义。`#...
2. **宏定义**:一些全局的宏定义,用于项目级别的配置,例如条件编译指令,常量定义等。 3. **全局变量声明**:尽管不推荐,但有时会在`stdafx.h`中声明全局变量,以确保在整个项目中的可见性。 4. ** ATL 和 MFC...
C语言中条件编译相关的预编译指令 C语言中条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。下面将详细介绍条件编译中使用的预编译指令。 一...
本文将深入探讨一些常见的C++预编译指令,特别是`#pragma`指令,以及预编译头文件的作用。 首先,`#pragma`指令是一种编译器特定的指令,它允许程序员对编译器的行为进行定制。例如,`#pragma message`参数可以在...
### C/C++ 预编译详解 #### 一、预编译概述 预编译是C/C++语言中的一项重要特性,它主要用于程序开发过程中的优化和代码管理。通过预编译,开发者可以...因此,在实际项目开发中,灵活运用预编译指令是非常有必要的。
C++预编译技术是C++编程中的一种重要机制,主要涉及预处理器(Preprocessor)的功能,用于在实际编译之前处理源代码。预编译技术主要包括宏定义、条件编译、头文件包含控制以及#pragma指令等。在本文中,我们将深入...
在C++预编译技术中,#Pragma指令是最复杂的指令之一,它可以设定编译器的状态或者是指示编译器完成一些特定的动作。 1. #Pragma message参数 #Pragma message参数可以在编译信息输出窗口中输出相应的信息。这对于...
预编译头文件说明 C/C++头文件一览 预处理的由来 常见的预处理功能 预处理指令 文件包含指令
- **预处理器**:在C++编译过程中,预处理器先于编译器运行,处理源代码中的预处理指令。 - **常见预处理指令**:除了宏定义外,还有`#include`用于引入头文件,`#ifdef/#ifndef`等用于条件编译,`#pragma`用于...
C++预编译命令是编程过程中提升效率和优化编译过程的重要工具,它们允许程序员针对特定的编译器和环境定制行为。`#Pragma`指令是C++预处理阶段的一个特性,它允许开发者向编译器发出特定的指令,这些指令可以调整...
预编译头文件是 C++Builder 中的一种重要机制,可以显著提高编译速度。在本文中,我们将讨论为什么 C++Builder 的编译速度会慢,然后介绍一个简单的方法来减少编译时间。 为什么 C++Builder 的编译速度会慢? -----...
C++预编译命令在编程过程中起到至关重要的作用,它们帮助开发者定制编译器的行为,以适应特定的系统环境和项目需求。`#pragma`指令是C++预处理中的一个特性,它允许程序员向编译器发出特定的指令,这些指令通常与...
在C++中,预编译头的创建通常通过`#include`指令来实现,使用特殊的语法形式,如: ```cpp #pragma once #include #include // 其他常被包含的头文件... ``` 然后,我们可以通过以下方式指定预编译头: ```cpp ...
- **`#ifdef`/`#ifndef`**:条件编译指令,根据宏是否已定义来决定代码段是否编译。 - **`#include`**:用于包含其他源文件或头文件,支持递归包含。 - **`#error`**:编译时抛出错误,停止编译。 - **`#pragma`**:...
C++预编译命令在编程过程中起到至关重要的作用,它们主要用来优化编译过程,提供特定平台或编译器的特性支持,以及帮助开发者更好地管理和控制代码。在本文中,我们将详细探讨一些常见的#pragma指令,这些指令对于...
### Delphi 编译指令详解 ...无论是通过 IDE 的图形界面还是源代码中的编译指令,都能够有效地利用这些选项来满足特定的需求。此外,合理的使用条件编译指令还可以进一步提高代码的可维护性和可读性。