//a.h
extern int x1;
static int x2;
int x3;
static const int x4;
class A {
public:
static const int x5 = 10;
};
a.h
将被多个包含.cpp
文件,我的问题是:
1.x1
只是一个声明,不是吗?所以它的定义应该在其中之一完成.cpp
文件,对吗?
2.x2
是一个定义,对吗?我曾经以为static int
也是一个声明,就像extern int
, 但是我错了。x2
仅在以下位置可见a.h
?
3.x3
将被定义多次,如果a.h
包含在多个.cpp
文件,所以x3
会导致编译错误,对吗?
4.x4
是一个定义,对吗?
5.在A班,x5
是一个声明,是的。但是关于x4
?
1.x1 只是一个声明,不是吗?所以它的定义应该在这些 .cpp 文件之一中完成,对吧?
Correct
2.x2 是一个定义,对吧?我曾经以为static int和extern int一样也是一个声明,但是我错了。 x2 只在 a.h 中可见?
不同的x2
将在包含标题的每个翻译单元中可用。
如果a.h包含在多个.cpp文件中,3.x3会被定义多次,所以x3会导致编译错误,对吗?
更准确地说,它将导致链接器错误。编译器处理每个翻译单元,链接器将它们绑定在一起并检测符号是否被定义了多次。
4.x4 是一个定义,对吗?
是的,这是一个定义,但就像x2
每个翻译单元都有自己的x4
(两者都是因为static
因为它是const
这意味着内部联系
5.这里在A类中,x5是一个声明,是的。但是x4呢?
Yes, x5
仅是一个声明(带有初始化)。可能会出现混乱,因为关键字static
在不同的上下文中被重用以表示不同的事物。在x5
它的意思是类的属性, 而在x4
它的意思是内部联系
最后一个例子比较特殊。它是唯一可以有值的声明 (IIRC),原因是它允许编译器use包含该标头的所有翻译单元中常量的值编译时间常数。如果该值必须与定义一起提供,则只有一个翻译单元可以访问该值。该静态成员的定义是:
const int A::x5; // no initialization here
如果会员是,则您必须提供一份odr-used。现在的事实是,在大多数情况下,常数不会是odr-used因为编译器将替换表达式时的值A::x5
用来。仅当该会员被用作lvalue您需要定义,例如:
void f( const int & ) {}
int main() {
f( A::x5 );
}
因为论证f
是一个参考,使用A::x5
需要一个lvalue(注意,常量性和左值/右值性几乎是正交的),这需要在程序中的单个翻译单元中定义成员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)