代码之家  ›  专栏  ›  技术社区  ›  Johan Kotlinski

为什么Cst在C++中暗示内部链接,而不是C?

c++
  •  71
  • Johan Kotlinski  · 技术社区  · 15 年前

    参见主题。他们在想什么?

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

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

    const int var_a = 1;
    int var_b = 1;
    

    …并用编译 g++ -c test.cpp 只有出口 var_b .

    7 回复  |  直到 15 年前
        1
  •  97
  •   Johannes Schaub - litb    15 年前

    我相信你是说

    为什么CONST隐含C++中的内部链接

    如果在名称空间范围内声明一个常量对象,那么它具有内部链接,这是真的。

    附录C给出了理由

    变化: 显式声明为const且未显式声明为extern的文件作用域的名称具有内部链接,而在C中则具有外部链接。

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

        2
  •  10
  •   anon    15 年前

    正如litb所说,const对象具有内部链接。这是因为它们的用途如下:

    // a.cpp
    const int BUFSIZE = 100;
    char abuf[BUFSIZE];
    
    // b.cpp
    const int BUFSIZE = 256
    int bbuf[BUFSIZE];
    
        3
  •  6
  •   Martin Cote    15 年前

    在C++中,“静态”有多种含义(它可以管理链接和存储)。 您必须阅读stroustrup的d&e来理解他的基本原理——但是当您在名称空间范围内声明一个变量为const时,它会自动具有内部链接——而在c中,您必须声明它是静态的,以强制它具有内部链接。

    当然,在C++中,已经禁止使用静态来控制链接,在C++中可以使用匿名命名空间来模拟内部链接。

    C++中的const变量应该取代预处理器常量,并且由于预处理器常量只能在定义它们的文件中可见,同样,const会自动使变量仅在定义它的文件中可见。

        4
  •  5
  •   LBushkin    15 年前

    const和static是C和C++中的正交概念。

    这个 const 关键字告诉编译器不允许变量显示为任何表达式的左值-本质上使其成为只读的。

    在C中 static 关键字有几种用途,这取决于它应用于什么。当应用于函数的变量时,它表示该变量不是存储在函数的本地范围内,而是在调用它时可以访问。当应用于一个全局变量或函数时,它只能被一个特定的文件访问——换句话说,它只能在编译单元内访问(除非声明 extern )

    在C++中 静止的 关键字可以在类定义中使用,以生成一个或多个变量 共享 跨类的所有实例,而不是每个实例的本地实例。此外,C++中的静态类函数只能访问该类的静态变量(或者它可以访问的类)。现在,在C++中 康斯特 除非明确声明,否则不会给成员提供与编译单元的内部链接 外部的 -这可能就是你所说的。这允许编译时常量通过使用头文件跨单元共享。不过,请记住,成员并非真正是静态的,而是常量 编译成 它被引用的每个位置。

        5
  •  3
  •   Klaim    15 年前

    这些概念是正交的 不应该认为是同一件事。

    constness是一种访问策略:它只告诉您的变量应该是只读(const)还是写-读(non-const)。

    静态性是一个终身(技术上是内存本地化)属性:它告诉变量是类范围内的全局变量(在类中时)还是翻译单元(与CPP中定义的全局变量一起使用时)。

        6
  •  -2
  •   Alex Brown    15 年前

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

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

    李特给出了最好的答案。

        7
  •  -4
  •   Martin Cote    15 年前

    没有。写下以下内容:

    const int i = 0;
    

    不做 i 静态(在C或C++中)。