zoukankan      html  css  js  c++  java
  • C++头文件保护符和变量的声明定义

    1#ifndef #define #endif头文件保护符

    在编译的过程中,每个.cpp文件被看成一个单独的文件来编译成单独的编译单元,#ifndef 保证类的头文件在同一个.cpp文件里被多次引用后不会出现重定义问题。

    注意:仅仅是防止在同一个.cpp文件里被多次引用。

    样例:

    // file1.h
    class file1
    {
    };
    
    // file2.h
    #include "file1.h"
    class file2
    {
    };
    
    // file3.h
    #include "file1.h"
    #include "file2.h"

    file3.h展开来是这种:

    // file1.h展开的内容
    class file1
    {
    };
    // file2.h展开的内容
    class file1
    {
    };
    class file2
    {
    };

    这时候就会出现重定义了,假设在每一个文件加上#ifndef头文件保护符:


    // file1.h
    #ifndef _FILE1_H_
    #define _FILE1_H_
    
    class file1
    {
    };
    
    #endif // !_FILE1_H_

    // file2.h
    #ifndef _FILE2_H_
    #define _FILE2_H_
    
    #include "file1.h"
    class file2
    {
    };
    
    #endif // !_FILE2_H_

    // file3.h
    #ifndef _FILE3_H_
    #define _FILE3_H_
    
    #include "file1.h"
    #include "file2.h"
    
    #endif // !_FILE3_H_

    这时候展开file3.h时,由于_FILE1_H_仅仅会被定义一次。所以就不会出现重定义错误。




    2、变量的声明和定义

    定义:用于为变量分配存储空间,还能够为变量指定初始值。在一个程序中,变量有且仅有一个定义。

    声明:用于向程序表明变量的类型和名字。在一个程序中。声明能够有多个。定义也是声明:当定义变量时我们声明了它的类型和名字。能够通过使用externkeyword声明变量名而不定义它:extern int i;。

    样例:

    // file1.h
    #ifndef _FILE1_H_
    #define _FILE1_H_
    
    int a = 1;
    
    #endif // !_FILE1_H_
    

    // file2.h
    #ifndef _FILE2_H_
    #define _FILE2_H_
    
    #include "file1.h"
    
    #endif // !_FILE2_H_
    

    // main.cpp
    #include <iostream>
    
    int main()
    {
    	extern int a;
    	std::cout << a << std::endl;
    
    	system("pause");
    	return 0;
    }


    这时候编译会报错,由于在file1.h定义了a。在file2.h的展开中又定义了a。

    有人会问。#ifndef不是防止重定义的吗?#ifndef是防止在同一个文件的重定义,在上面的情况,file1.h和file2.h是两个不同的文件。所以会在file1.h和file2.h同一时候出现int a = 1,就出现重定义错误了。

    所以不要在头文件定义变量,最好的做法是:在头文件声明变量,在.cpp定义变量,在须要使用该变量的地方先声明再使用。

    改动下上面的样例:

    // file1.h
    #ifndef _FILE1_H_
    #define _FILE1_H_
    
    extern int a;
    
    #endif // !_FILE1_H_
    

    // file1.cpp
    #include "file1.h"
    
    int a = 1;

    // file2.h
    #ifndef _FILE2_H_
    #define _FILE2_H_
    
    #include "file1.h"
    
    #endif // !_FILE2_H_
    

    main.cpp不变。这时候就能够正常执行了。




    3、能够在头文件定义的三个例外

    (1)类的定义。

    类的定义很多其它像是声明,由于此时并没有分配空间。

    (2)值在编译时就已知的const对象。

    如:const char c = 'c';,这个是在编译时就已经确定值的。之后程序不能改变。

    而const char *c = 'c';是不能够的,由于指针不是在编译时确定值的。

    (3)inline内联函数。

  • 相关阅读:
    normalize.css介绍和使用,normalize与CSS Reset的区别
    解决在Windows10没有修改hosts文件权限
    定时器
    常见代码题
    BFC与margin重叠
    清除浮动的方法以及优缺点
    面向对象的理解
    左边固定右边自适应
    正则
    《STL源码剖析》——第一、二、三章
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5116129.html
Copyright © 2011-2022 走看看