常规命名空间内匿名命名空间内符号的链接

时间:2010-11-15 02:53:55

标签: c++ namespaces anonymous linkage

在C ++中,将函数或变量放在匿名命名空间中会使其内部链接,即i。即与在文件级别声明它static相同,但是惯用的C ++。

普通命名空间中的匿名命名空间怎么样?它是否仍然保证内部联系?

// foo.cpp

void func1() {
    // external linkage
}

static void func2() {
    // internal linkage
}

namespace {
    void func3() {
        // internal linkage
    }
}

namespace ns1 {
    void func4() {
        // external linkage
    }

    namespace {
        void func3() {
            // still internal linkage?
        }
    }
}

3 个答案:

答案 0 :(得分:15)

匿名命名空间中的实体不一定具有内部链接;他们实际上可能有外部联系。

由于未命名的命名空间的名称对于编译它的翻译单元是唯一的,因此无论它们的链接是什么,您都无法从该翻译单元外部引用在其中声明的实体。< / p>

C ++标准说(C ++ 03 7.3.1.1/note 82):

  

虽然未命名的命名空间中的实体可能具有外部链接,但它们实际上由其翻译单元唯一的名称限定,因此永远不会从任何其他翻译单元中看到。

答案 1 :(得分:12)

C ++ 11(草案N3337)§3.5/ 4 :(强调我的)

  
    

未命名的命名空间或在未命名的命名空间中直接或间接声明的命名空间具有内部链接。所有其他名称空间都有外部链接。如果名称为

,则具有未在上面给出内部链接的命名空间范围的名称与封闭命名空间具有相同的链接          

- 变量;或

         

- 一个功能;或

         

- 一个命名类(第9节),或在typedef声明中定义的未命名类,其中该类具有用于链接目的的typedef名称(7.1.3);或

         

- 命名枚举(7.2),或在typedef声明中定义的未命名枚举,其中枚举具有用于链接目的的typedef名称(7.1.3);或

         

- 属于具有链接的枚举的枚举器;或

         

- 模板。

  

这保证任何未命名的命名空间都有内部链接。

  

普通命名空间中的匿名命名空间怎么样?它是否仍然保证内部联系?

虽然在命名(普通)命名空间内,但它是一个未命名的(匿名)命名空间,因此保证按照C ++ 11标准进行内部链接。


  

将函数或变量放入匿名命名空间使其链接内部,i。即与在文件级声明静态相同,但习惯性的C ++。

在C ++ 11中,static在此上下文中的使用是 undeprecated ;虽然unnamed namespace is a superior alternative to staticthere're instances where it failsstatic补救; inline namespace was introduced in C++11解决此问题。

答案 2 :(得分:5)

  

$ 3.5 / 3 - “具有命名空间的名称   范围(3.3.6)具有内部联系   它是

的名字      

- 变量,   功能或功能模板   显式声明为static;或者,

     

- a   显式声明的变量   const并且都没有明确声明   extern也没有声明过   外部联系;或

     

- 数据成员   一个匿名工会。

所以,我怀疑程序中的任何名称'func3'和'func4'是否都有内部链接。他们有外部联系。但是,只是根据詹姆斯的引用,他们不能从其他翻译单位转介。