我的问题与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 ?
答案 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
关键字所做的只是告诉程序在运行时仅将内存分配给变量一次。
对不起,我误解了这个问题,并且在同一时间弄错了我的答案。忽略这个答案!