【问题标题】:Why does const imply internal linkage in C++, when it doesn't in C?为什么 const 在 C++ 中暗示内部链接,而在 C 中却没有?
【发布时间】:2009-06-15 21:12:15
【问题描述】:

见主题。他们在想什么?

更新:从“静态”更改为“内部链接”以避免混淆。

举个例子...将以下内容放入文件中:

const int var_a = 1;
int var_b = 1;

...使用g++ -c test.cpp 编译时只导出var_b

【问题讨论】:

    标签: c++


    【解决方案1】:

    我相信你的意思

    为什么 const 在 C++ 中暗示内部链接

    确实,如果你在命名空间范围内声明一个 const 对象,那么它就有内部链接。

    附录 C (C++11, C.1.2) 给出了基本原理

    更改:显式声明为 const 而未显式声明为 extern 的文件范围的名称具有内部链接,而在 C 中它将具有外部链接

    基本原理: 因为 const 对象可以用作 C++ 中的编译时值,所以这个特性促使程序员为每个 const 提供显式的初始化值。此功能允许用户将 const 对象放在包含在许多编译单元中的头文件中。

    【讨论】:

    • 好像non-const全局对象也可以初始化,但是为什么标准不给它内部链接呢?
    【解决方案2】:

    正如 litb 所说,const 对象在 C++ 中具有内部链接。这是因为它们打算这样使用:

    // a.cpp
    const int BUFSIZE = 100;
    char abuf[BUFSIZE];
    
    // b.cpp
    const int BUFSIZE = 256
    int bbuf[BUFSIZE];
    

    【讨论】:

      【解决方案3】:

      常量和静态在 C 和 C++ 中都是正交的概念。

      const 关键字告诉编译器不允许变量作为任何表达式的左值出现 - 实质上是使其只读。

      在 C 中,static 关键字有多种用途,具体取决于它的应用。当应用于函数的变量时,它表明该变量不存储在函数的本地范围内,但可以通过调用它来访问。当应用于全局变量或函数时,它只能被特定文件访问 - 换句话说,它只能在编译单元内访问(除非声明为 extern)。

      在 C++ 中,static 关键字可以在类定义中使用,以使变量或函数在类的所有实例之间共享,而不是每个实例的本地。此外,C++ 中的静态类函数只能访问该类(或它有权访问的类)的静态变量。现在,在 C++ 中,const 确实为成员提供了与编译单元的内部链接,除非它们被明确声明为 extern - 这可能就是您所指的。这允许通过使用头文件跨单元共享编译时常量。但请记住,成员并不是真正静态的 - 而是将常量编译到每个引用它的位置。

      【讨论】:

        【解决方案4】:

        在 C 和 C++ 中,术语静态有多种含义(它可以控制链接和存储) 您必须阅读 Stroustrup 的 D&E 才能了解他的基本原理 - 但是当您在命名空间范围内将变量声明为 const 时,它会自动具有内部链接 - 而在 C 中您必须将其声明为静态以强制它具有内部链接。

        当然在 C++ 中,使用静态来控制链接已被弃用,匿名命名空间可用于模拟 C++ 中的内部链接。

        C++ 中的 const 变量应该替换预处理器常量 - 由于预处理器常量只在定义它们的文件中可见,类似地,const 自动使变量只在定义它的文件中可见。

        【讨论】:

          【解决方案5】:

          这些概念是正交的,不应被视为同一事物。

          常量是一种访问权限:它只告诉你的变量是只读的(常量)还是写读的(非常量)。

          Staticity 是一个生命周期(从技术上讲是内存本地化)属性:它告诉变量在类的范围内是全局的(当在类中时)还是翻译单元(当与定义的全局变量一起使用时)一个cpp)。

          【讨论】:

            【解决方案6】:

            它没有,最明显的例子是,如果你有一个 const 成员变量(当然,它是由构造函数初始化的),它不是由该类的所有对象共享,而是由每个对象共享。

            class A {
            public:
              A(int newx) : x(newx);
            private
              int x;
            }
            

            litb 在上面给出了最好的答案。

            【讨论】:

            • 他不是一直这样吗? (litb)
            【解决方案7】:

            它没有。编写以下内容:

            const int i = 0;
            

            不会使 i 成为静态(在 C 或 C++ 中)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-06-21
              • 1970-01-01
              • 2017-03-12
              • 1970-01-01
              • 1970-01-01
              • 2011-09-04
              • 1970-01-01
              • 2011-06-09
              相关资源
              最近更新 更多