zoukankan      html  css  js  c++  java
  • [C++] 头文件中的#ifndef,#define,#endif以及#pragma用法

    想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?

    1、 其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include "a.h" 和#include "c.h"此时就会造成c.h重复包含。

    2、头文件被重复引用引起的后果:

    (1)有些头文件重复引用,只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率就是很重要的了。

    (2)有些头文件重复包含,会引起编译错误,比如在头文件中定义了全局变量或写了函数的实现而不是声明(虽然这种方式不被推荐,但确实是C规范允许的),这种会引起重复定义。

    3、 是不是所有的头文件中都要加入这些代码?

        不是一定要加,但是不管怎样,用#ifndef/#define/#endif或者其他方式避免头文件重复包含,只有好处没有坏处。培养一个好的编程习惯是学习编程的一个重要分支。所以在写头文件时,最好是把内容都写在#ifndef和#endif之间。

    4、以add.h为例

    #ifndef  _ADD_H_
    #define _ADD_H_
    
    //在这里包含add.h的类定义及变量和函数的声明
    比如函数声明:int add(int a ,int b);  //分号是必须加上的
    
    #endif  //_ADD_H_

    编写add.cpp文件

    #include"add.h"
    int add(int a , int b)
    {
      return a+b;  
    }

    主函数main.cpp文件

    #include <iostream>
    #include "add.h"
    using namespace std;
    
    int main()
    {    
        int a ;
        a = add(2,3);
        cout<<a<<endl;
        return 0;
    }

    1)程序中_ADD_H_为预处理器变量,书写格式一般是头文件名大写,前后加下划线,“.”用下划线代替。比如stdio.h表示为_STDIO_H_.

    2)预处理器变量一般有两种状态:已定义或未定义。

      #ifndef 指示检测指定的预处理器变量是否未定义,如果未定义,那么跟在后面的所有指示被处理,直到出现#endif;如果已定义,那么#ifndef测试为假,该指示和#endif指示间的代码都被忽略。

      #define 指示接受一个名字并定义该名字为预处理器变量。

    3)在调用该头文件时一般用#include "add.h"。

    4)但是,必须记住的是预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将减慢编译速度,所以如果可能,应该避免出现多重包含。

    5、#pragma的用法

    #pragma once     
    
    ...  //此处放头文件中本来应该写的代码

    #pragma once 是个预处理指令,在头文件的最开始加入这条指令表示:这个头文件只被编译一次,是由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。

    6、总结: 

       #ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,移植性好,所以如果写的程序要跨平台,最好使用这种方式。但缺点是宏名字不能冲突。

       #pragma 可以避免名字冲突,缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。且不是所有编译器都支持这种方式。

  • 相关阅读:
    匿名对象
    封装性
    1 Django初探
    8 定制10MINs 3
    7 定制10MINs首页2
    5-1 练习css 总结
    6.定制10MINS首页1
    3-1 练习 HTML 总结
    5. css定位 居中
    4 CSS的20/80个知识点
  • 原文地址:https://www.cnblogs.com/zhizhiyu/p/10134044.html
Copyright © 2011-2022 走看看