我读过有关它通常是如何最好的,因为冗余副本适用于包括头文件中的其它文件中做出不定义头文件什么。 然而,在静态联方法的情况下,看来我得把它定义在现场(至少Visual Studio 2010中不会让我这样做)。 所以,如果我在头文件写的接口,我不能定义静态联方法从类定义的或在cpp文件侧。
所以,我应该费心在所有使用静态联方法? 和涉及的问题:我应该甚至在头文件中定义的任何方法或变量(约常量是什么)?
总之,奇怪的是,它不是东西是覆盖了非常详细的我的C ++的书。
编辑:我大约静态联方法类似的问题阅读,但他们都不能够直接解决这个问题。
如何添加在头文件中的函数定义?
这可以在3种可能的方式来实现:
- 标记功能
inline
或 - 使得功能
static
或 - 把功能匿名命名空间。
什么是这样做的正确方法?
#1
,即:打标功能inline
是正确的方法来此没有打破一个定义规则 。
什么是错的另外两个appraoches?
在这两个#2
& #3
每个转换单元将包含它的函数的自己的版本,并计划将包含几个不同的版本,从而导致在生成的二进制的尺寸增加的功能。
即:对于static
函数fun()
&fun
将在每个转换单元不同,并且程序将包含N
不同版本的功能。
此外,如果函数中包含静态局部变量则会有N
不同的静态局部变量,每个函数实例。
第一种方法是怎样避免这个问题?
一个inline
函数有外部链接。
当你标记功能inline
的功能将在所有的翻译单位相同的地址。 此外,静态当地人和一个内联函数的主体内定义的字符串文字被视为跨越翻译单元相同的对象。
总之,一个内联函数将在所有的翻译单位相同的地址。
什么是处理static inline
在头函数定义?
在static
关键字强制功能有一个内部链接。
定义为内联函数每个实例都视为一个单独的功能,每个实例都有自己的静态当地人和字符串文字的副本。 因此,这将类似于#2
。
注意:
该标准授权的所有定义inline
在用户程序功能,您必须在该函数的使用或调用的所有翻译单元完全相同的定义。
相关Standerdese引用:
C ++ 03标准
3.2一个定义的规则:
第3段:
每个程序应包含被在该程序中使用的每个非内联函数或对象中的正好一个定义; 没有诊断需要 。 的定义可以在程序显式出现,可以在标准或用户定义的库,或可以找到(在适当的时候)它是隐式定义(参见12.1,12.4和12.8)。 内联函数应每翻译单元在其中使用它来限定。
7.1.2功能符
第4段:
内联函数应每翻译单元在其被使用并应具有完全相同在每种情况下(3.2)相同的定义来限定。 [注:其定义出现在翻译单元之前,内联函数的调用,可能会遇到。 如果与外部链接的函数在一个转换单元被声明内联的,它应在内嵌在其中出现所有翻译单元声明; 没有诊断是必需的。 与外部链接的内联函数必须在所有的翻译单位相同的地址。 在anextern内联函数静态局部变量总是指向同一个对象。 在外部内联函数文本字符串是在不同的翻译单元相同的对象。
(1)I不能定义静态联方法从类定义的或在cpp文件侧。
您可以定义一个static inline
在头文件中的类之外的方法。 演示 。 你不能在.cpp文件中定义它们。
(2)我懒得在所有使用静态内联方法
我会说,他们可以很容易避免。 如果你需要看在你自己的目的,头文件中的身体,那么只会让他们inline
。
(3)应我甚至在头文件中定义的任何方法或变量(约常量什么)
- 类体里面,你可以定义
static const
整型数据。 -
static
方法可以在类体内定义 -
static inline
方法可以类体内或类体外部的头文件内定义 -
static
数据成员必须被安排在一个定义.cpp
文件有一个定义规则 ,坚持