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内联函数。

  • 相关阅读:
    年轻人的第一个 Spring Boot 应用,太爽了!
    面试问我 Java 逃逸分析,瞬间被秒杀了。。
    Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
    坑爹的 Java 可变参数,把我整得够惨。。
    6月来了,Java还是第一!
    Eclipse 最常用的 10 组快捷键,个个牛逼!
    Spring Cloud Eureka 自我保护机制实战分析
    今天是 Java 诞生日,Java 24 岁了!
    厉害了,Dubbo 正式毕业!
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5116129.html
Copyright © 2011-2022 走看看