首页 > 其他分享 >learncpp-7 作用域、生存期、链接

learncpp-7 作用域、生存期、链接

时间:2024-07-22 22:33:19浏览次数:7  
标签:int 作用域 BasicMath 空间 add 生存期 learncpp 命名

7 作用域、生存期、链接

用户自定义命名空间和范围解析运算符

  • 为了避免命名冲突,在尽可能小的作用域内定义标识符
  • 一个命名空间要么在全局作用域内定义,要么在另一个命名空间内定义
  • 使用范围解析运算符::可以告诉编译器去指定命名空间查找指定标识符(如果::前没有命名空间则表示全局命名空间)
  • 如果使用标识符时没有带范围解析运算符,则编译器首先在使用该标识符的命名空间内查找是否有匹配的声明;如果没有则往外层的命名空间继续查找;最后查找全局命名空间
// 以下代码输出Foo; 如果注释掉Foo里的print()则输出Out;如果再注释掉Out里的print()则输出global
#include "iostream"
void print() {
    std::cout << "global";
}
namespace Out {
    void print() {
        std::cout << "Out";
    }
    namespace Foo {
        void print() {
            std::cout << "Foo";
        }
        void printHelloThere() {
            print();
        }
    }
}
int main() {
    Out::Foo::printHelloThere();
    return 0;
}
  • 对于一个命名空间里的标识符,它们的前向声明也应该放在该命名空间里
// add.h
namespace BasicMath{
  int add(int x,int y);// 在BasicMath命名空间里声明add()
}
// add.cpp
namespace BasicMath{
  int add(int x,int y){ // 在BasicMath命名空间里定义add()
    return x+y;
  }
}
// main.cpp
#include "add.h" // 为了引入BasicMath::add()
#include <iostream>
int main(){
  std::cout<<BasicMath::add(3,4)<<'\n';
  return 0;
}

如果add()前向声明没有放在BasicMath命名空间里,则add()会在全局作用域中声明,则编译器会报错找不到BasicMath::add()的声明;
如果add()的定义没有放在BasicMath命名空间里,编译不会报错,但是链接器会报错BasicMath::add()未定义

  • 可以在多个位置(跨多个文件或一个文件的多个位置)声明命名空间块

标准库大量使用了这个特性,因为每个标准库头文件都包含了std命名空间的声明,否则整个标准库都得在一个头文件中定义
这意味着可以将自己的代码添加到std命名空间中,但这可能会导致未定义的行为,因为std命名空间不允许用户扩展

  • 嵌套命名空间有两种形式:namespace a{namespace b{}}或者namespace a::b{}(自从c++17支持)
  • 命名空间别名:namespace c = a::b;

标签:int,作用域,BasicMath,空间,add,生存期,learncpp,命名
From: https://www.cnblogs.com/akongogogo/p/18317113

相关文章

  • learncpp-14 类
    14类14.9构造器当类有私有成员时,无法使用聚合初始化构造器是一个特殊的成员函数,它在非聚合类的对象创建后自动调用构造器不会创建对象:编译器在调用构造器之前就为对象分配了内存,然后在未初始化的对象上调用构造函数构造器需要初始化对象的成员,因此不能为constconst对象不......
  • learncpp-12 复合类型:引用和指针
    12复合类型:引用和指针12.1复合数据类型介绍函数也是一种复合数据类型12.2左值和右值表达式除了可以产生值和副作用,还可以计算为对象或函数C++中的所有表达式都有两个属性:类型和值类别表达式的类型就是计算表达式得出的值、对象、函数的类型表达式的类型必须在编译时......
  • learncpp-20 函数
    20函数20.1函数指针函数和变量一样,也是在内存中被分配了一块地址。因此,函数指针就是一个保存函数的内存地址的变量函数也是有类型的,例如foo()这个函数的类型就是返回整数且不带参数intfoo(){return5;}<<操作符不知道如何输出函数指针(因为有无数种可能的函数指针),因......
  • learncpp-21 操作符重载
    21操作符重载21.12重载赋值运算符拷贝构造器和拷贝赋值运算符的作用几乎相同,都是将一个对象复制到另一个对象。但是拷贝构造器初始化新的对象,而赋值运算符替换已有对象的内容如果在拷贝前必须创建一个新对象,则使用拷贝构造器(包括按值传递和按值返回)如果在拷贝前无需创......
  • learncpp-1 C++基础
    1C++基础1.1语句和程序结构语句是一条让计算机执行某个动作的指令,是C++语言中最小的独立计算单元在高级语言(例如C++)中,一条语句可能编译成多条机器指令大多数语句以;结尾声明语句跳转表达式语句复合语句选择语句(条件语句)迭代语句(循环语句)try代码块函......
  • learncpp-2 函数和文件
    2函数和文件2.9命名冲突和命名空间两个(或多个)同名函数(或全局变量)被引入到属于同一程序的不同文件中,这将导致链接器错误。两个(或多个)同名函数(或全局变量)被引入到同一个文件中。这将导致编译器错误。不同的作用域(例如命名空间)中可以有相同的标识符只有声明和定义可以出现......
  • Java基础06:变量、常量、作用域
    1.变量Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。变量在使用前必须对其声明,只有在变量声明以后,才能为其分配相应长度的存储单元,声明格式为:typevarName=value,varName2=value2;//数据类型变......
  • 【时时三省】(C语言基础)变量的作用域和生命周期
    山不在高,有仙则名。水不在深,有龙则灵。              ——csdn时时三省作用域局部变量的作用域:就是变量所在的局部范围 比如inta=0它只能在它的那个括号里面使用出了括号就没用了全局变量的作用域:整个工程整个工程里面就是在哪里都可以......
  • java入门---作用域
    作用域:作用域是指在程序中定义变量的区域,该变量在该区域内可被访问。1、关于作用域的两种查询在JavaScript中编译器会用两种查询方式进行查询一种是LHS查询;一种是RHS查询;俩个查询的含义是,当变量出现赋值操作在左侧时进行LHS查询,出现在右侧时进行RHS查询。详细的讲就是R......
  • 0基础学python-12:命名空间和作用域
    目录前言命名空间(Namespace)特点和用途:Python中一般有三种命名空间: 命名空间的查找顺序:作用域(Scope)Python的作用域一共有4种: 作用域查找顺序:代码实例:总结:  前言        命名空间(Namespace)和作用域(Scope)是程序设计中重要的概念,它们有助于组织和管......