• C++中const和constexpr的多文件链接问题


    C++语言支持分离编译,在多文件编程中:变量或函数可以被声明多次,但却只能被定义一次。如果要在多个文件中使用同一个变量,变量的定义能且只能出现在一个文件中,在其他使用该变量的文件中需要声明该变量。如果想声明一个变量而非定义它,就在前面加上关键字extern,并且不能显示初始化变量:

    复制代码
    //a.cpp
    int j = 5;    //定义j并初始化
    
    //b.cpp
    extern int j;    //声明j
    /*使用j...*/
    
    //以下声明形式是错误的:
    //extern int j = 5;
    复制代码

    上面的例子中,在b.cpp中,a.cpp里面定义的j是可见的。于是我们对j的使用不会出现错误。

    constexpr是C++11标准引入的,constexpr是一种类似于const的常量类型,只能使用常量表达式对constexpr的变量进行初始化,并且编译器在编译时会对表达式是否是常量进行检查,确保用于初始化constexpr变量的表达式的值一定不会在运行时是未知的。对于const和constexpr(C++11)的变量来说,它们默认是内部链接的,也就是说它们只在定义它们的文件中可见。比如:

    复制代码
    //a.cpp
    const int i = 5;
    constexpr int j = 10;
    
    //b.cpp
    extern const int i;    //错误,i不可见
    extern constexpr int j;    //错误,j不可见
    复制代码

    在上面的例子中,a.cpp中定义的i和j在b.cpp中是不可见的,b中对于i和j的声明代码会被编译器认为是想要定义常量i和j但却没有初始化,由于const和constexpr在定义时必须初始化,因此编译器会报错。我们可以在定义const变量是加入extern关键字,来指出这个const变量是外部链接的:

    复制代码
    //a.cpp
    extern const int i = 5;
    extern constexpr int j = 10;
    
    //b.cpp
    extern const int i;    //正确,i是外部链接的
    extern constexpr int j;    //错误,不能指定constexpr为外部链接
    复制代码

    这里多说一句:变量会在定义时申请存储空间,因此不能使用不完整类型定义变量,而只能使用不完整类型声明变量。

  • 相关阅读:
    QT线程池的使用
    Android---动态权限适配问题
    CY3-NHS ester良好的光稳定性介绍1032678-38-8
    Docker:docker部署Nginx
    【MySQL数据库原理】在MySQL Workbench界面运行SQL代码——学生管理系统
    Pikachu漏洞练习平台之SSRF(服务器端请求伪造)
    微信小程序overflow-x超出部分样式不渲染
    flink安装与基础测试
    SSM框架学习(三、MyBatis实践:提高持久层数据处理效率)
    Blender做一个小凳子学习笔记
  • 原文地址:https://www.cnblogs.com/pkuqcy/p/17776669.html