2010-01-25 77 views

回答

24

static意味着该方法不与类的实例相关联。 (即它没有“this”指针)。

inline是一个编译提示,该方法的代码应该被包含在内联的地方,而不是通过普通分支调用。 (请注意,许多编译器会忽略此关键字,并使用他们自己的指标来决定是否内联)。

这些是正交(无关)的概念,所以没有特别的原因,他们不能合并。

+3

内联的更重要的含义是该方法的多个定义是允许的(并且假定是相同的)。这允许函数定义在多个地方包含的头文件中。 仍然没有理由他们不能合并。事实上,对于模板中的静态方法,它们几乎必须是。 – KeithB 2010-01-25 16:49:03

1

我不明白为什么不。静态类成员就像一个独立的函数,可以私人访问其他成员函数。

2

是的,没有理由不能组合。

1

您可以。

然而,GCC手册说,该功能不会被编译器集成到代码,如果:

  1. 调用方法,你定义它之前,或
  2. 有内任何递归调用定义。

来源:GCC Manual - 讨论C和C++。

我尝试使用称为Class1的小样本类在Visual C++中对这两种场景进行编码。这里是相关的片段,其中incTest是在我的Class1.h文件中定义的。

// test static inline method - based on the GCC manual's C example 
static inline int inc (int *a) 
{ 
    return (*a)++; 
} 

// test recursive call in a static inline method 
static inline int fac (int x) 
{ 
    return x * fac(x-1); 
} 

int Class1::incTest(int* x) 
{ 
    return inc(x); 
} 

这是成功编译的版本。但是,如果我使用的是Visual C++,并且将inc()的定义移动到incTest()的定义之后,则该文件无法成功编译,因此在调用inc()时发生错误,表示“标识符不是发现”。

编辑:修改我的答案,以考虑我在Visual C++中的测试的评论和结果。

+2

这些条件都不会阻止您声明方法内联。 – 2010-01-25 16:51:12

+4

这是错误的。这两个限制都不是C++的一部分。它们可能会限制函​​数在生成的代码中实际内联的能力,但您仍然可以将它们标记为内联。如果需要在头文件中定义它们,例如,如果它们是模板化的,这非常有用。 – KeithB 2010-01-25 16:55:11

相关问题