具有名称空间范围的名称的c ++内部链接

时间:2018-09-30 17:48:52

标签: c++

我的问题与What does "internal linkage" mean?非常相似。但是我仍然感到困惑,所以我不得不问。

C ++ 11 ISO说:

  

如果名称空间是显式声明为静态的变量,函数或函数模板的名称,则具有名称空间范围的名称具有内部链接;或...

     

当名称具有内部链接时,其表示的实体可以由同一翻译单元中其他作用域的名称引用。

但是,在以下代码中:

namespace N {
  static int t = 3;
}

int main() {
  int p = t + 1; // complain here: t is undefined
  return 0;
}

为什么会这样?我的意思是名称空间 N 的主要功能和声明位于同一源文件中,因此它们位于同一翻译单元中,对吗?并且 t 具有名称空间范围,并明确声明为 static 。那么为什么仍然找不到 t

2 个答案:

答案 0 :(得分:2)

您要混合两个单独的概念:作用域和链接。

Scope告诉您名称在哪里可见。命名空间范围意味着该名称在定义它的命名空间中可见。在该名称空间之外,该名称不可见。这就是为什么您必须在不在名称空间N::i内的代码中说N的原因。

链接是关于其他翻译单元中可用的对象。暂时忘记命名空间; static int i = 3;将创建一个名为int的类型为i的对象,其初始值为3。因为标记为static,它具有内部链接。该对象可以在定义其的翻译单元(宽松地,相同的源文件)中使用。 不能在任何其他翻译单元中使用。因此,如果另一个源文件说extern int i;并尝试对i做某事,它将不会链接:未定义的符号i。

引用的文本讨论了两者的交集:命名空间内定义的静态对象。这有点模糊,但是如果您将其阅读为“它……只能只能被同一翻译单元中其他作用域的名称引用”,则应更加清楚。或“ 其他任何翻译单元中的名称都不能引用它……”。”也就是说,它限制该名称的使用方式。它不会扩展名称的范围;它仍然在命名空间范围内。

答案 1 :(得分:-1)

<罢工> 存在命名空间以区分具有相同名称的相似函数,类,变量。

如果您有两个名为library(shiny) ui <- fluidPage( fileInput("CF", label = "CF"), fileInput("ED", label = "ED"), actionButton("Run", "Run"), verbatimTextOutput("code") ) server <- function(input, output, session) { cf_file <- reactive({ cfFile <- input$CF return(cfFile$datapath) }) ed_file <- reactive({ edFile <- input$ED return(edFile$datapath) }) table_content <- eventReactive(input$Run, { req(input$ED$datapath) req(input$CF$datapath) file_ed <- ed_file() file_cf <- cf_file() file_ed2 <- tools::file_path_sans_ext(file_ed) paste0("/bin/qt con ed -i ", file_cf, " -p ", file_ed, " > ", file_ed2,".db") }) output$code <- renderText({ req(table_content()) table_content() }) } shinyApp(ui, server) 的变量,它们分别执行不同的操作,则可以将一个变量存储在命名空间中,以便区分它们。

foo

输出: 4

您必须写namespace N { static int foo = 3; } int main() { int foo = 1; std::cout << foo + N::foo << std::endl; return 0; } 而不是N::foo的原因是因为它们是单独的变量。

foo对此无济于事,因为所有static关键字所做的只是告诉程序在运行时仅将内存分配给变量一次。

对不起,我误解了这个问题,并且在同一时间弄错了我的答案。忽略这个答案!