• 对声明和定义的理解


      可以先看看这篇博客

      一个变量函数可以被声明无数次,但是却至多只能被定义一次,且在该变量或函数在使用时必须被定义一次。(若该函数/变量不被使用,则可以只声明不定义)

      一、判断一条语句是否为变量的声明:若变量前有extern关键字,则它为声明,若变量前没有extern关键字,则其为定义

    extern int i;    //声明i
    int i;            //定义i,但未对i进行初始化
    int i = 5;        //是一个定义,同时对i进行了初始化。

      总之:判断一条语句是否为声明的声明,关键是看该语句中是否包含extern关键字而非看该语句中是否包含”=”,”=”的作用是对变量进行初始化

      一个例外: extern int i = 5; 该语句是一个定义,这句话的作用是定义一个全局的int类型变量,变量名为i,i的初值为5。

      不能在函数体中使用该语句,会报错: error C2205: 'i': cannot initialize extern variables with block scope。只能在函数外部使用,作用与“int i = 5;“相同。所以”extern int i = 5“这条语句的价值不大。

      

      二、判断一条语句是否为函数声明若函数包含了实现体(即“{}),则其为函数定义,否则为函数声明

    void fun()        //函数定义
    {
    }
    
    void fun()    //函数声明

      声明一个函数或者变量实际上就是对编译器说:这个函数/变量是存在的。只有当使用这个变量/函数时,编译器才会去确认该变量/函数是否真正存在,如果发现该变量/函数实际并不存在,那么就会build失败。

      变量/函数是否真正存在取决于是否定义了这个变量/函数。

      若存在某头文件a.h,a.h中定义了变量i“int i;“;若同时有b.c和c.c都include a.h,则build该project时会出错,为何:因为实际上b.c和c.c都包含“int i;“这条语句,在分别compile b.c和c.c时,”int i;“这条语句被compile了两次,因此相当于变量i被定义了两次,因此在link时会出错。

  • 相关阅读:
    Protobuf通信协议
    python发送消息到activeMQ后java接收到BinaryMessage的坑
    golang time.Duration() 问题
    golang操作redis
    golang之网络编程
    golang之反射
    golang之goroutine和channel
    golang之单元测试
    golang之文件操作
    XmlHelper 工具类
  • 原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/12008629.html
Copyright © 2020-2023  润新知