c/c++中的标识链接有几种方式 外部链接 内部链接
答案:2 悬赏:20 手机版
解决时间 2021-04-10 19:07
- 提问者网友:感性作祟
- 2021-04-10 14:39
c/c++中的标识链接有几种方式 外部链接 内部链接
最佳答案
- 五星知识达人网友:一把行者刀
- 2021-04-10 16:01
当一个实现文件(.cpp ...)编译时,预处理器(CPP)首先递归的包含头文件,形成一个保含有所有必要信息的单个源文件. 这个源文件称为 编译单元.
内部连接 如果一个名称对于它的编译单元来说是局部的, 并且在连接的时候不可能与其它编译单元中的同样的名称相冲突,则这个名称具有内部连接.即具有内部连接的名称不会被带到目标文件中.
外部连接 在一个多文件程序中,如果一个名称在连接时可以和其他编译单元交互,那么这个名称就具有外部连接. 即具有外部连接的名称会引入到目标文件中,由连接程序进行处理.这种符号在整个程序中必须是惟一的.
具有内部连接的定义包括:
具有外部连接的定义包括:
声明本身不会将任何符合引入目标文件,所以声明都是内部连接的.
某些声明可以激活对一个外部连接定义的访问,也许我们会很随便的说这些声明具有外部连接,如:
int f();
extern int i;
class Point { static int s_numPoints; ... };
还有一些声明即不把什么符号引入目标文件,也不能用来激活对外部连接定义的访问,我们常常称这类声明具有内部连接,
typedef int INT;
class Point;
struct Point;
把一个带有外部连接的定义放在 .h 文件中都会引起错误.由于类的声明和定义都是内部连接的,一般都放在 .h 文件中.
非内联的类成员函数.如: Point& Point::operator+=(const Point& right) { ... }
非内联,非静态的自由函数. 如: Point operator+(const Point& left, const Point& right) { ... }
非静态的全局定义.
加 static 前缀的全局变量定义.如: static int x;
枚举类型的定义.如: enum Boolean {NO,YES };
类的定义. 如: class Point { int d_x; int d_y; ... };
内联函数的定义.如: inline int operator==(const Point& left,const Point&right) { ... }
union的定义.
名字空间中const常量定义
特别说明:
C++规定,有const修饰的变量,不但不可修改,还都将具有内部链接属性,也就是只在本文件可见。(这是原来C语言的static修饰字的功能,现在const也有这个功能了。)又补充规定,extern const联合修饰时,extern将压制const这个内部链接属性。于是,extern char const s[]将仍然有外部链接属性,但是还是不可修改的。 具体使用方法如下:
在cpp文件中:extern const int a=1;
在要使用该常量的cpp文件中:extern const int a;//也可以将其放到头文件中
cout< 当用extern修饰const变量将强制为其分配内存,因为extern表示采用外部链接,因此其必须有某个地址保存其值。
内部连接 如果一个名称对于它的编译单元来说是局部的, 并且在连接的时候不可能与其它编译单元中的同样的名称相冲突,则这个名称具有内部连接.即具有内部连接的名称不会被带到目标文件中.
外部连接 在一个多文件程序中,如果一个名称在连接时可以和其他编译单元交互,那么这个名称就具有外部连接. 即具有外部连接的名称会引入到目标文件中,由连接程序进行处理.这种符号在整个程序中必须是惟一的.
具有内部连接的定义包括:
具有外部连接的定义包括:
声明本身不会将任何符合引入目标文件,所以声明都是内部连接的.
某些声明可以激活对一个外部连接定义的访问,也许我们会很随便的说这些声明具有外部连接,如:
int f();
extern int i;
class Point { static int s_numPoints; ... };
还有一些声明即不把什么符号引入目标文件,也不能用来激活对外部连接定义的访问,我们常常称这类声明具有内部连接,
typedef int INT;
class Point;
struct Point;
把一个带有外部连接的定义放在 .h 文件中都会引起错误.由于类的声明和定义都是内部连接的,一般都放在 .h 文件中.
非内联的类成员函数.如: Point& Point::operator+=(const Point& right) { ... }
非内联,非静态的自由函数. 如: Point operator+(const Point& left, const Point& right) { ... }
非静态的全局定义.
加 static 前缀的全局变量定义.如: static int x;
枚举类型的定义.如: enum Boolean {NO,YES };
类的定义. 如: class Point { int d_x; int d_y; ... };
内联函数的定义.如: inline int operator==(const Point& left,const Point&right) { ... }
union的定义.
名字空间中const常量定义
特别说明:
C++规定,有const修饰的变量,不但不可修改,还都将具有内部链接属性,也就是只在本文件可见。(这是原来C语言的static修饰字的功能,现在const也有这个功能了。)又补充规定,extern const联合修饰时,extern将压制const这个内部链接属性。于是,extern char const s[]将仍然有外部链接属性,但是还是不可修改的。 具体使用方法如下:
在cpp文件中:extern const int a=1;
在要使用该常量的cpp文件中:extern const int a;//也可以将其放到头文件中
cout< 当用extern修饰const变量将强制为其分配内存,因为extern表示采用外部链接,因此其必须有某个地址保存其值。
全部回答
- 1楼网友:轮獄道
- 2021-04-10 16:32
不明白啊 = =!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯