函数声明中的静态关键字在函数定义中可能会丢失吗?

时间:2011-03-10 14:43:07

标签: c++ c function static declaration

我想要一个静态函数,我在定义它之前在我的.c文件中声明:

//file a.c version 1
static int foo();
...
static int foo()
{
...
}

但是,似乎我可以将static关键字从函数定义中删除,并且我没有得到编译器警告......例如。

//file a.c version 2
static int foo();
...
int foo()
{
...
}

假设这两种形式完全相同,我是否正确?
如果是这样,为什么允许这种差异,我应该使用哪种形式?

5 个答案:

答案 0 :(得分:7)

是7.1.1 / 6

  

在没有存储类说明符的命名空间作用域中声明的名称具有外部链接,除非由于先前的声明而具有内部链接,并且未声明const。 / p>

另见7.1.1 / 7的例子

答案 1 :(得分:3)

7.1.1 / 7:

  

连续隐含的联系   特定实体的声明应   同意。也就是说,在给定的范围内,   每个声明都宣布相同   对象名称或相同的重载   函数名称应表示相同   键。

7.1.1 / 6 :(感谢史蒂夫 - 这也是答案要求明确的必要条件)

  

在命名空间作用域中声明的名称   没有存储类说明符   除非有外部联系   由于以前的内部联系   声明并提供它不是   声明const。对象声明为const   并没有明确声明extern   有内部联系。

是的,这两个是相同的。

然而这无效:

int foo();

static int foo() {
  return 0;
}

答案 2 :(得分:1)

static - 在此上下文中 - 仅影响范围,当您声明函数static时,它具有文件范围。因此,您可以通过尝试从其他来源访问该功能来轻松检查它是否相同。

这样我们就可以避免讨论编译器语言等。

答案 3 :(得分:0)

static属性将可见性更改为编译单元。这允许在不同文件中使用相同的名称用于不同目的。你应该只使用静态一次。如果你有原型,你必须在这里。

当你要求C++时,你不应该使用静态但匿名的命名空间来使编译单元的symbold变为私有:

namespace {
    int foo();
}

void bar()
{
    foo();
}

答案 4 :(得分:0)

作为旁注,C ++提供了static的优越替代方案。您也可以在这里使用未命名的命名空间

实施例,

namespace 
{  
   void f()
   {
   }
}

见这些:

Superiority of unnamed namespace over static?
Why an unnamed namespace is a "superior" alternative to static?