zoukankan      html  css  js  c++  java
  • C++ 宏和预编译 预编译头

    备注:本小节我也写不出来了个所以然,本人学习C++没有多长时候。如果你们有好的建议和想法请联系告知。谢谢。

    C++ 宏:

         宏展开:在代码中出现的宏,会用宏实体代替。宏一般都是用大写字母。

    #define 定义常量、函数宏

    #undef  结束常量、函数宏定义

    C++ 预处理器:

         预处理器处理源代码,在编译器之前运行。预处理器用指定的头文件的内容替代每个#include.

         预处理器变量有两种状态:已定义和未定义。#define 指示接受一个名字并定义该名字为预处理器变量。#ifndef 指示检测指定的预处理器变量是否已定义。

        如果未定义,那么跟在其后的所有指示都被处理,直到出现#endif.

    #pragma 一般格式为:#pragma para 其中para为参数

    #pragma once 多次包含保护。只要在头文件的最开始加入这条指令就能保证头文件被编译一次(这点我晕了,不是头文件参与编译吗),考虑到兼容性好多地方都没有广泛使用。

    等价于

    #ifndef **

    #define **

    //TODO:

    #endif

    C++ 预编译头

       预编译头大家应该都见过,国内用VC++的应该很多。我当初第一次看见  #include "stdafx.h" ,我真晕了。

    后来才知道,这是有关预编译头的。

       “预编译头” 一开始听见这个名字觉得很怪异。怎么不是“预编译头文件” 它有什么作用?

    C++预处理时,只是将“宏定义、头文件”加载到源文件.cpp文件。说白点就是把头文件里内容直接“粘帖”到相应的 #include 语句处。

    以下为为引用他人博客内容

         头文件的出现,固然给书写程序带来了很大方便。可是到了 Windows 时代后,慢慢就呈现出一些问题了。几乎所有的 Windows 程序都必须包含 windows.h,而那个文件却硕大无比,将它展开后往所有文件中一粘贴,编译的时候立刻慢得像只蜗牛。

        到了 MFC 时代后,情况更为恶劣了。毕竟 C 风格的 Windows 头文件里面包含的还仅仅是函数定义和宏,编译难度不算太大,而 MFC 库里面的头文件可都是类声明啊!更何况,一个最简单的工程,都会生成大量的类,需要用到大量的函数。如果工程稍微复杂一些,编译难度可想而知!
      但是,人们惊奇地发现,虽然用到的头文件又多又杂,但是在一个工程中,总有那么一堆头文件,是几乎所有 cpp 都必须包含的。那么,可不可以把这些头文件提取出来,只编译一遍,然后所有其它 cpp 就都能使用呢?没错,这就是预编译头的思想都由来!

      实践证明,使用了预编译头技术后,编译速度大大提高了。可以到你的工程目录下的Debug 或 Release 目录中看一看,里面有一个体积极为硕大的 .pch 文件,那就是传说中的“编译之后的预编译头”。

    预编译头的概念:
    所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预 编译头文件这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常 改变。如果这些代码被修改,则需要重新编译生成预编译头文件。

    预编译头的使用:
         要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)
     想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我

    们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件

    里只有一句代码就是:#include “Stdafx.h”。

    以下为我参考别人的成果:

     1.预编译指令

    01) #
    空指令,无任何效果

    02) #include
    包含一个源代码文件

    03) #define
    定义宏

    04) #undef
    取消已定义的宏

    05) #if
    如果给定条件为真,则编译下面代码

    06) #else
    作为其他预处理的剩余选项进行编译

    07) #ifdef
    如果宏已经定义,则编译下面代码

    08) #ifndef
    如果宏没有定义,则编译下面代码

    09) #elif
    如果前面的#if给定条件不为真,当前条件为真,则编译下面代码

    10) #endif
    结束一个#if……#else条件编译块

    11) #line
    改变当前的行数和文件名称

    12) #pragma
    为编译程序提供非常规的控制流信息

    13) #error
    停止编译并显示错误信息

    接下来讲解:C++ 声明与定义 C++ 内部连接与外部连接

    静静的寻找属于自己的.....

  • 相关阅读:
    .netcore初体验
    ASP.NET MVC实现单用户登录
    远程连接桌面报:这可能是由于credssp加密oracle修正
    想起以前写的一个爬虫,然后就用C#WinForm写了一个下载小说的软件,比较简单
    List泛型与DataTable相互转换
    SqlServer-触发器
    SqlServer-RBAC五表权限
    SqlServer通用存储过程
    用vs2017结果无法启动IIS express
    简单的叙述下SQL中行列转换的小知识!
  • 原文地址:https://www.cnblogs.com/renxs/p/2319983.html
Copyright © 2011-2022 走看看