在块范围内没有链接
No linkage at block scope?
在一个块中声明的所有变量都有'无链接'吗?
例如:1:
如果我声明一个静态变量:
void foo()
{
static int i;
}
有内部链接还是没有链接?如果没有链接,那么为什么要将其设置为静态呢?
2:
如果我使用extern会发生什么?
/*global scope*/
static int i;
void foo()
{
extern int i;
}
在这种情况下,i
的链接是什么?
确实,在函数范围内'no linkage'。
目标是生存期管理:静态具有全局静态的生存期,同时具有局部静态的可见性(作用域)。注意
在c++中,你也可以通过将静态变量('globals')封装在一个匿名命名空间中来声明没有链接的静态变量。这个技巧通常用于头文件库:
namespace /*anon*/
{
void foo() {} // only in this translation unit
int answer = 42; // this too
}
如果我使用
extern
会发生什么?
如果使用extern,则声明仅为extern
声明(没有定义)。因此,根据定义,通常期望外部链接在另一个翻译单元中定义。(因此,它的作用与在全局作用域声明时相同)。这类似于局部函数声明:
int main()
{
void exit(int); // equivalent to non-local declaration
}
请注意,在 2.
示例中,变量i
已经被声明为static
,因此它不会获得外部链接。我可能会在另一个没有链接器冲突的翻译单元中声明。
-
"它有内部链接还是没有链接?"如果没有联动,为什么要让它静止呢?"——它没有连杆。
static
指定静态存储时间 -
"如果我使用extern会发生什么?"它将是一个带有外部链接的名称声明,由于在全局作用域中没有链接,因此程序将报告链接错误。编辑:由于之前的
static
声明在作用域中可见,标准说名称"接收先前声明的链接"3.5/6,因此foo()
中的i
将具有内部链接。
相关文章:
- 内联函数中具有内部链接的全局变量
- 具有命名空间范围的名称的 C++ 内部链接
- 内联函数/变量的外部链接
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 如何链接范围::有条件地查看
- 内联是否决定内部链接?
- 显示链接列表内联
- 内联函数的链接器未解析的外部符号
- 内联失败:可以在链接时覆盖函数体
- 内联函数时出现链接器错误
- gcc 5.1 中的链接时间优化是否足以放弃内联简单函数
- C++ 链接器错误 - 未定义引用"到未内联定义的函数
- 在 ipv6 链接范围单播 udp 客户端-服务器中应用 boost::asio::ip::udp,有时有效,但有时无效
- 为什么使用内联函数的程序根据链接顺序和参数具有不同的行为
- 是包含内联链接的模板类的方法
- 在O(n)时间内创建链接列表的副本
- 在两个单独的 cpp 文件中定义的内联函数是否可以在链接期间创建重复的符号
- 为什么 clang++ 警告内联enable_if然后无法链接
- 在块范围内没有链接
- 如何使用外部链接在命名空间范围内定义常量双精度