`
阿尔萨斯
  • 浏览: 4174370 次
社区版块
存档分类
最新评论

c++ 中 预编译指令

 
阅读更多
#include 包含头文件
#if 条件
#else 否则
#elif 否则如果
#endif 结束条件
#ifdef 或 #if defined 如果定义了一个符号, 就执行操作
#ifndef 或 #if !defined 如果没有定义一个符号,就指执行操作
#define 定义一个符号
#undef 删除一个符号
#line 重新定义当前行号和文件名
#error 输出编译错误 消息, 停止编译
#pragma 提供 机器专用的特性,同时保证与C++的完全兼容

include:
include 用“”来包含自定义头文件,从用户的工作路径开始搜索,用<>来包含标准库头文件,从标准库路径开始搜索.
对于<iostream>和<iostream.h>,虽然两者都能实现,但是,对于标准库的头文件,推荐不加.h,这是标准.
只能include 头文件

编译控制指令:
控制代码的编译过程,防止重定义.,以及版本控制等功能.

#define宏定义符号
#define DDD “12415afafwa”
#define EEE 12333344
#define CCC
DDD定义字符串,是char*类型,EEE是int类型, CCC只声明符号,但为赋值,一般只用与检测防止重定义,在c++中定义常量一般使用const,而不是define宏
define除了宏定义符号外,还可以定义函数操作
#define MAX(a,b) (a>b)?(a):(b)
#define PLUS(x,y)\
{\
cout<<x+y<<endl;\
}
多行函数每行末尾加一个\,最后一行不加。
define中的使用宏##、#@、#。##就是连接的意思,#@是两边加单引号,#就是双引号了,例
#define A(x) A_##x
#define B(x) #@x
#define C(x) #x
int A(1)=2;
char d=B(.);
char *bbq=C(asfasgw);
使用define执行函数操作的优点:
使用函数需要额外的开销,它需要开辟栈空间,记录返回地址,将形参压栈,从函数中返回,释放堆栈,而define中的形参却不占用内存,即节约空间,也节约时间。
对于上述的MAX(x,y)宏,它可以进行int,float,double,等其他可用>比较大小的数据类型的大小判断,而函数的形参要与实参一致。
缺点:
每次使用就是将宏拷贝入程序中,大量使用会大幅度增加程序的长度。



#undef
删除#define定义的符号
#define PI 132
#undef PI

#if #else #elif #endif
#ifdef == #if defined
#ifndef == #if !defined
判断语句,进行各种判断来保证编译的顺利进行
用if开始判断,最后一定要用#endif来结束
#if !defined AAA
defined AAA
#endif
懒得写,摘点百度百科:
#if defined block1 && defined block2
...
#endif
#if CPU==PENTIUM4
...
#endif
#if LANGUAGE == ENGLISH
#define Greeting "Good Morning."
#elif LANGUAGE == GERMAN
#define Greeting "Guten Tag."
#elif LANGUAGE == FRENCH
#define Greeting "Bonjour."
#else
#define Greeting "Hi."
#endif
std::cout<<Greeting << std::endl;
#if VERSION == 3
...
#elif VERSION == 4
...
#else
...
#endif
可以看见,我们使用这些判断语句,可以对系统进行判断,对版本进行判断,从而确保不同系统上的不同版本的程序都能正确的运行。也可以避免重复引用同一个头文件或其他情况的重定义。


标准的预处理器宏:
__LINE__ 当前源文件中的代码行号,十进制整数
__FILE__ 源文件的名称,字符串字面量
__DATE__  源文件的处理日期,字符串字面量,格式mmm dd yyyy其中mmm是月份如Jan、Feb等 dd是01-31 yyyy是四位的年份
__TIME__ 源文件的编译 时间,也是字符串字面量格式是hh:mm:ss
__STDC__ 这取决于实现方式,如果编译器选项设置为编译标准的C代码,通常就定义它,否则就不定义它
__cplusplus 在编译C++ 程序时,它就定义为199711L
#line
可以修改__FILE__返回的字符串
cout<<__FILE__<<__LINE__<<endl;
#line 158
cout<<__FILE__<<__LINE__<<endl;
#line __LINE__"ffffff"
cout<<__FILE__<<__LINE__<<endl;
#line 200"fff"
cout<<__FILE__<<__LINE__<<endl;



#error
在预处理阶段,如果出现了错误,则#error指令可以生成一个诊断 消息,并显示为一个编译错误,同时中止编译

#pragma
专门用于实现预先定义好的选项,其结果在编译器说明文档中进行了详细的解释。编译器未识别出来的#pragma指令都会被忽略
对于我所使用的vs2012中,有一个常用的预编译指令
#pragma once
确保头文件只被编译一次
如果不用这个的话,要使头文件不重复编译的写法为将整个头文件的内容全部写在判断内部
//#pragma once
#ifndef A_H
#define A_H
#include "stdafx.h"
const static int bb=0;//
extern int cc=0;
static int dd=5;
int ee;
#endif

#assert()宏
在标准库头文件<cassert>中声明
用于在 程序中 测试一个逻辑表达式,如果逻辑表达式为false, 则assert()会终止 程序,并显示诊断 消息
用于在条件不满足就会出现重大错误,所以应确保后面的语句不应再继续执行,所以它的应用非常灵活
注意: assert不是错误处理 机制,逻辑表达式的结果不应产生负面效果,也不应超出 程序员的控制(如找开一个文件是否成功), 程序应提供适当的代码来处理这种情况
可以使用#define NDEBUG来关闭断言 机制
int a=5;
int c=3;
assert(c<a);


assert(a<c);

#define NDEBUG必须放在#include <cassert>前,才能关闭断言


分享到:
评论

相关推荐

    C++预编译指令用法

    c++几个预编译指令用法:#undef ,#ifdef,#ifndef,#if

    C++中的预编译指令

     在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序...

    关于预编译头文件

    预编译头文件说明 C/C++头文件一览 预处理的由来 常见的预处理功能 预处理指令 文件包含指令

    hexrays破解版C++反编译工具.zip

    它能处理任何主流的C/C++编译器产生的代码。浮点指令(也就是XMM/MMX/SSE)是不支援的。它拥有互动和批次处理模式。它是一个IDA Pro插件的载体。IDA 5.1或者更高的版本都是必须的。Hex-Rays Decompiler支持 IntelX86...

    宏和预编译(书中截图笔记)

    由浅入深学c++——基础进阶与做300题

    c++程序using声明和using编译指令.zip

    c++程序using声明和using编译指令.zip

    C/C++程序编译流程详解

    经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理 ①将所有的“#...

    C++ 自考模拟试题

    C++ 自考模拟试题 这个是第六套 共有七套

    Boost C++ Libraries 1.63.0,Windows + MinGW 编译

    Boost编译指令:b2.exe --build-type=complete toolset=gcc variant=release link=static threading=multi runtime-link=static install 对于QT使用,已经写好一个 boost.pri 文件放在Boost目录下,只需要在 *.pro ...

    如何在C++中添加头文件,c++万能库头文件

    避免重复包含:为了避免同一个头文件被多次包含,通常会在头文件的开头和结尾使用预处理器指令来防止重复包含 编译程序:最后,使用C++编译器编译你的程序。编译器会处理所有的#include指令,并将包含的头文件内容...

    在C++中使用openmp进行多线程编程

    多线程在实际的编程中的重要性不言而喻。对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ ...在Linux平台上,如果需要使用omp,只需在编译时使用"-fopenmp"指令。在Windows的visual

    花指令添加器2.0

    花指令添加器2.0

    win10+vs2019+bazel+编译tensorflow2.1.1-CPU版(含测试程序)

    Win10下编译的Tensorflow-v2.1.1 C++库 CPU版 win10+vs2019+py3.7.9+bazel0.29.1+tensorflow2.1.1-CPU 支持AVX2指令集 由于机器无N卡,只能编译cpu版,后续再编译其他版本 测试程序含官方的c++例子和网上找的代码,...

    浅谈c++ 预处理器

    预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。 我们...

    C++从零开始---入门教程

    C++从零开始(十六)——何谓预编译指令(说明预编译指令的概念及几个常用指令 的应用) C++从零开始(十七)——C++中的一些生僻关键字(explicit、mutable、volatile等的说 明) C++从零开始(十八)——何谓SDK...

    C++编写DLL动态链接库的步骤与实现方法

    本文实例讲述了C++编写DLL动态链接库的步骤与实现方法。分享给大家供大家参考,具体如下: ...为了能让客户端程序和DLL程序公用该类的一份头文件,通常在类的头文件中使用宏和预编译指令来处理。如下DLLTest.h:

    转载:已编译好的openssh库

    四、附录:在VC中对C/C++ 运行时库不同版本编译指令说明 《在VC中对C/C++ 运行时库不同版本编译指令说明》(http://blog.yesky.com/271/dgkang/1737771.shtml)一文中详细介绍了连接不同版本库的编译指令如下: C ...

    ARM C/C++编译器

    ARM C/C++编译器可以被使用... 其中,armcc用于将遵循ANSI C标准的C语言源程序编译成32位的ARM指令代码,它通过了Plum Hall C Validatin Suite测试。armcpp用于将遵循ANSI C++或者EC++标准的C++语言源程序编译成

    ZXing C++编译用的CPPgithub资源和配套的stb资源

    ZXing C++编译用的CPPgithub资源和配套的stb资源 zxing-cpp stb 编译指令 cmake -S zxing-cpp -B zxing-cpp.release -DCMAKE_BUILD_TYPE=Release cmake --build zxing-cpp.release -j8 --config Release

    小熊猫c++开发工具(Dev-C++升级版本)免安装版本

    Dev-C++是一个小巧的开源C/C++ 集成开发环境,解压即可不需要配置环境即可使用,功能强大,有提示又稳定,比vscode、visual studio,非常适合于C/C++ 语言的初学者使用,但是到2015年后已停止开发。 因为教学的需要...

Global site tag (gtag.js) - Google Analytics